这部作品:
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
首先,当使用 pthread 进行编译时,您要使用
-pthread
,而不是 -lpthread
- -pthread
可能会启用程序在多线程环境中工作所需的一些编译时选项。
问题并不在于你的命令行 - 这是 GNU
ld
的问题。 GNU ld
,在遇到 -lXXX
选项时,读取由 libXXX.so
或 libXXX.a
定义的所有符号,检查在 -lXXX
选项之前指定的文件中是否提到了这些符号。命令行,并且忘记了其余的符号。
换句话说:目标文件和库的命令行顺序会改变链接器的行为。
当计算机的内存非常有限时,这可能是合理的,但现在它只是一个来自早已被遗忘的时代的愚蠢的工件,应该在不久前就已经修复了。
当然,与定义相同符号的多个库链接可能会出现问题,但肯定有更明智的方法来允许这种情况下的预期行为。
底线:对于GNU
ld
(由gcc
调用),只有你问题中的第一个命令是有效的,因为ld
仍然生活在以前的计算时代。
为了更加理智,请在链接
和编译 pthread 相关程序时使用
-pthread
。