编译错误gcc -lpthread位置

时间:2013-12-22 15:59:16

标签: gcc compiler-construction compiler-errors linker position

这项工作:

    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

1 个答案:

答案 0 :(得分:2)

首先,在使用pthread进行编译时,您希望使用-pthread而不是-lpthread - -pthread可以启用程序工作所需的一些编译时选项多元环境。

问题不在于您的命令行 - 这是GNU ld的问题。 GNU ld在遇到-lXXX选项时会读取libXXX.solibXXX.a定义的所有符号,检查文件中是否有任何符号提及已在命令行中的-lXXX选项之前指定,并忘记其余符号。

换句话说:目标文件和库的命令行顺序会改变链接器的行为。

当计算机的内存非常有限时,这可能是合情合理的,但现在它只是一个长期被遗忘的时代的愚蠢神器,应该已经修复了一段时间。

当然,可能会出现与定义相同符号的几个库链接的问题,但肯定有更好的方法来允许这种情况的预期行为。


底线:对于GNU ld(由gcc调用),只有你问题中的第一个命令有效,因为ld仍然存在于前一个计算时代。 / p>

为了更加理智,请在链接编译与pthread相关的程序时使用-pthread