为什么我应该在编译器命令行上将源文件名放在库名称之前?

为什么我应该在编译器命令行上将源文件名放在库名称之前?

作为 OpenSUSE 的用户,我习惯于输入:

gcc -lz myfile.c

令我惊讶的是,在 Ubuntu 上此命令会失败,并显示以下内容:

myfile.c:(.text+0x5): undefined reference to `zlibVersion'
collect2: error: ld returned 1 exit status

gcc -v发现collect2Ubuntu 上的 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

相关内容