这项工作:
gcc a.o b.o -o a -lpthread
这不起作用:
gcc -lpthread a.o b.o -o a
并显示一些错误:
undefined reference to `pthread_create'
因此,当我使用Makefile进行编译时,它会生成
gcc -lpthread a.o b.o -o a
哪个不起作用。
有什么想法吗?
P.S:我正在使用gcc 4.6.3 / Ubuntu 12.04
答案 0 :(得分:2)
首先,在使用pthread进行编译时,您希望使用-pthread
而不是-lpthread
- -pthread
可以启用程序工作所需的一些编译时选项多元环境。
问题不在于您的命令行 - 这是GNU ld
的问题。 GNU ld
在遇到-lXXX
选项时会读取libXXX.so
或libXXX.a
定义的所有符号,检查文件中是否有任何符号提及已在命令行中的-lXXX
选项之前指定,并忘记其余符号。
换句话说:目标文件和库的命令行顺序会改变链接器的行为。
当计算机的内存非常有限时,这可能是合情合理的,但现在它只是一个长期被遗忘的时代的愚蠢神器,应该已经修复了一段时间。
当然,可能会出现与定义相同符号的几个库链接的问题,但肯定有更好的方法来允许这种情况的预期行为。
底线:对于GNU ld
(由gcc
调用),只有你问题中的第一个命令有效,因为ld
仍然存在于前一个计算时代。 / p>
为了更加理智,请在链接和编译与pthread相关的程序时使用-pthread
。