0

我有这个简单的 c 代码

当我将它链接为

gcc  -g app.c.o  -o app  -lrt -lpthread -lc

但是如果我们改变链接 libc 和 libthread 的顺序

gcc  -g app.c.o  -o app  -lrt -lc -lpthread

这没用。

我们知道在 FreeBSD 上,libc 中 pthread 函数的存根是弱引用。例如

objdump -T /lib/libc.so.7 | grep pthread_cond_signal
00000000000e2bf0  w   DF .text  0000000000000011  FBSD_1.0    pthread_cond_signal

这意味着链接的顺序无关紧要。为什么这样?

4

2 回答 2

1

使用选项编译和链接-pthread。注意缺少的“ell”。


更新

  • -pthread指示创建二进制文件(预处理器、编译器、链接器)所涉及的所有工具注意要构建的应用程序/库按预期运行。(这显然只有在源使用pthread_*-family 函数的任何成员时才需要。)

  • -lpthread链接一个名为 的库libpthread,仅此而已。

细节上的差异是特定于实现的。

注意:如果-pthread已经指定-lpthread,则不需要也不建议指定。

于 2013-06-18T07:30:44.557 回答
0

该行为的原因是链接器仅按提供的顺序通过库单次传递来解析符号。

因此,它需要先了解这些pthread_*函数,-lpthread然后才能解析对以后库中这些函数的引用。

我相信使用弱引用是为了让你可以拥有-lc需要的函数-lpthread,但如果你不引用这些函数,-lc那么它的引用pthread_*无法解析并不是一个错误。

于 2013-08-15T15:58:52.930 回答