我有这个简单的c-code
当我将其链接为
时,它可以正常工作
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
这意味着链接顺序无关紧要。为什么这样?
答案 0 :(得分:1)
使用选项-pthread
进行编译和链接。注意缺少的“ell”。
<强>更新强>:
-pthread
指示创建二进制文件(预处理程序,编译器,链接程序)所涉及的所有工具,以确保要构建的应用程序/库按预期运行。 (这显然只有在来源使用pthread_*
- 函数族的任何成员时才有必要。)
-lpthread
链接名为libpthread
的库,仅此而已。
细节上的差异是特定于实现的。
注意:如果指定了-pthread
,则不需要-lpthread
,也不建议您进行指定。
答案 1 :(得分:0)
此行为的原因是链接器仅按提供的顺序执行单个传递库以解析符号。
因此,它需要知道来自pthread_*
的{{1}}函数才能解析后续库中对这些函数的引用。
我认为使用弱引用是为了让-lpthread
中的函数能够-lc
,但如果你没有引用-lpthread
中的那些函数而不是{错误的是它无法解析对-lc
的引用。