gcc/g++ 参数顺序

Posted

技术标签:

【中文标题】gcc/g++ 参数顺序【英文标题】:gcc/g++ parameter order 【发布时间】:2013-01-31 10:20:45 【问题描述】:

我刚刚在我的新 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 参数排序的事实或技巧,也许还有一点背景知识 为什么需要这种方式的信息?

谢谢

【问题讨论】:

【参考方案1】:

对象和库的顺序与链接器相关(编译器在创建可执行文件时隐式调用)。当链接器在其从左到右的扫描中发现使用了一个它不知道的名称时,它开始从该点开始寻找定义。如果定义通过,它不会记住它以供以后使用。

【讨论】:

换句话说:错误的例子有问题,链接器找到 fuse 和 pthreads 但在他找到它们时没有使用它们,所以他删除了库。工作示例首先告诉链接器,例如chironfs.o 需要 pthreads,因此链接器开始搜索它并稍后在参数列表中从 chironfs.o 点找到它 - 与 fuse 相同,对吧? @JohnDoe,没错。是的,链接器是愚蠢的。抱歉,现在让它变得聪明为时已晚(很大程度上取决于它当前的行为)。【参考方案2】:

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

您的问题实际上是关于 ld 链接器的工作原理。为简单起见并在没有无限循环的情况下处理循环引用,它只通过库列表一次,解析引用。因此,如果您的引用出现在某个地方并且尚未看到包含它的库,那么这只是一个错误。

也请read this讨论,这里会更详细地讨论这个问题。

【讨论】:

以上是关于gcc/g++ 参数顺序的主要内容,如果未能解决你的问题,请参考以下文章

gcc/g++链接时.o文件及库的顺序问题

gcc/g++命令参数

gcc/g++ 编译参数

gcc与g++:联系区别和命令

gcc,g++

ubuntu下安装gcc,g++