我刚刚在我的新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被使用
我找到了一个解决方案here,建议将库放在目标文件之后
所以我删除了-lfuse并在行的最后添加了-lfuse -lpthread
现在它编译没有错误,似乎这是应该的方式:目标文件后的库
我的问题是: 为什么参数顺序与gcc / ld相关?我认为gcc就像其他所有应用程序一样解析params并且可以将必要的参数转发给ld或者这样的
一般来说:任何人都知道gcc参数排序的事实或提示,也许有点背景知识 有关为何需要这种方式的信息?
感谢
答案 0 :(得分:4)
对象和库的顺序与链接器相关(在创建可执行文件时由编译器隐式调用)。当链接器在其从左到右的扫描中发现使用名称时,它不知道它开始从上的那个点查找定义。如果定义经过,它将不记得以供以后使用。
答案 1 :(得分:2)
GCC本身以相对透明的方式将参数传递给ld
您的问题实际上是关于ld链接器的工作原理。为了简单起见并处理没有无限循环的循环引用,它只通过一次库列表,解析引用。因此,如果您的引用发生在某处,并且它还没有看到包含它的库,那么它只是一个错误。
另请read this讨论,更详细地讨论这个问题。