我刚刚在我的新的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,但是fuse错误有点奇怪,因为正在使用-lfuse
我找到了一个解决方案here,它建议将库放在目标文件之后
因此,我删除了-lfuse,并在行的末尾添加了-lfuse -lpthread
现在它编译时没有错误,看起来它应该是这样的:对象文件后的库
我的问题是:为什么参数顺序与gcc/ld相关?我认为gcc只是像其他应用程序一样解析参数,并可能将必要的参数转发给ld或类似的应用程序。
总而言之:有谁知道关于gcc参数排序的事实或提示,以及为什么需要这样做的一些背景信息?
谢谢
发布于 2013-01-31 20:07:58
对象和库的顺序与链接器相关(在创建可执行文件时由编译器隐式调用)。当链接器在从左到右的扫描中发现一个它不知道的名称的用法时,它就会开始寻找从这一点开始的定义。如果传递了一个定义,它就不会记住它以供以后使用。
发布于 2013-01-31 20:07:32
GCC本身以相对透明的方式将参数传递给ld
你的问题实际上是关于ld链接器是如何工作的。为了简单起见,为了处理没有无限循环的循环引用,它只遍历一次库列表,解析引用。因此,如果您的引用出现在某个地方,并且它还没有看到包含它的库,那么这只是一个错误。
也请read this讨论,在那里这个问题将被更详细地讨论。
https://stackoverflow.com/questions/14623415
复制相似问题