作为 OpenSUSE 的用户,我习惯于输入:
gcc -lz myfile.c
令我惊讶的是,在 Ubuntu 上此命令会失败,并显示以下内容:
myfile.c:(.text+0x5): undefined reference to `zlibVersion'
collect2: error: ld returned 1 exit status
我gcc -v
发现collect2
Ubuntu 上的 GCC C 编译器生成的命令以开头,--as-needed
而在 OpenSUSE 上则不存在此选项。即 Ubuntu 上的命令行如下所示:
/usr/lib/gcc/x86_64-linux-gnu/5/collect2 --build-id --eh-frame-hdr\
-m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker \
....[a lot of stuff removed].....\
-lz /tmp/cc7kz9Nz.o ....[yet more stuff removed].....\
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o
在 OpenSUSE 上,除了选项之外,它看起来非常相似--as-needed
。
/usr/lib64/gcc/x86_64-suse-linux/4.8/collect2 --build-id --eh-frame-hdr\
-m elf_x86_64 -dynamic-linker \
....[a lot of stuff removed].....\
-lz /tmp/cccpZlmL.o ....[yet more stuff removed].....\
/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../lib64/crtn.o
这种差异从何而来?是否已在某处讨论过?我不应该将库名称放在源文件名之前吗?
答案1
这是有记录的在 Ubuntu 维基上。默认情况下设置它是为了减少包中的依赖项数量,但正如您发现的那样,这意味着库的顺序很重要:您需要确保出现对象(任何类型)前他们使用的库。
您可以使用 禁用此功能--no-as-needed
。