gcc/g++ 参数顺序

8

我刚在我的新Ubuntu 12.10服务器上编译了ChironFS,但出现了以下错误:

gcc  -Wall -W -Wmissing-prototypes -g -O2 -DFUSE_USE_VERSION=25 -D_FILE_OFFSET_BITS=64 -I/usr/local/include -g -O2 -lm -lfuse  -o chironfs chironfs.o chiron-conf.o chirondbg.o chironfn.o  
chironfs.o: In function `chiron_init':
/root/chironfs-1.1.1/src/chironfs.c:2000: undefined reference to `pthread_create'
chironfs.o: In function `get_rights_by_name':
/root/chironfs-1.1.1/src/chironfs.c:452: undefined reference to `fuse_get_context'
pthread错误告诉我-lpthread丢失了,但是lfuse错误有点奇怪,因为使用了-lfuse。我在这里找到了一个解决方案,建议在目标文件后面放置库文件。因此,我删除了-lfuse,并在行的末尾添加了-lfuse -lpthread。现在编译没有错误,而且看起来应该是这样的:库文件在目标文件后面。
我的问题是:为什么参数顺序对于gcc / ld很重要?我认为gcc只是像其他应用程序一样解析参数,并可以将必要的参数转发给ld等。
总的来说:是否有人知道关于gcc参数排序的事实或提示,以及为什么需要这样做的背景信息?
谢谢。
2个回答

12

对象和库的顺序对于链接器(在创建可执行文件时由编译器隐式调用)非常重要。当链接器在从左到右的扫描中遇到一个它不知道的名称时,它会从那个点开始寻找定义。如果一个定义被跳过,它不会记住它以后使用。


2
换句话说,错误的示例存在问题,链接器在找到fuse和pthreads但在那一点上没有使用它们,因此他放弃了这些库。而正确的示例首先告诉链接器例如chironfs.o需要pthreads,因此链接器开始搜索并在稍后从chironfs.o点在参数列表中找到它 - fuse也是同样的情况,对吗? - John Doe
2
@JohnDoe,没错。是的,链接器很蠢。抱歉,现在让它变聪明已经太晚了(很多取决于它当前的行为)。 - vonbrand

2

GCC本身以相对透明的方式向ld传递参数。

你的问题实际上是关于ld链接器如何工作的。为了简单起见并避免无限循环处理循环引用,它只会通过库列表一次,解决引用关系。因此,如果你的引用在某个地方出现,并且它还没有看到包含它的库,那么就会出现错误。

此外,请阅读这篇讨论,其中更详细地讨论了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接