@FelixPalmen 答案的附加假设。 pthread 可以传递给 gcc 规范中声明的链接器。 gcc 可以使用内置规范或从文件中读取。
实验
默认情况下,当我尝试在没有-lpthreads 的情况下构建示例时,系统链接器会出现打印错误:
serga@XXXXX:~$ gcc ./thread.c -o thread
/tmp/ccHgCRzO.o: In function `main':
thread.c:(.text+0x29): undefined reference to `pthread_create'
collect2: error: ld returned 1 exit status
首先我检测到which files gcc tries to use as spec:
serga@XXXXX:~$ strace gcc 2>&1 | grep spec
access("/usr/lib/gcc/i686-linux-gnu/5/specs", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/lib/gcc/i686-linux-gnu/5/../../../../i686-linux-gnu/lib/i686-linux-gnu/5/specs", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/lib/gcc/i686-linux-gnu/5/../../../../i686-linux-gnu/lib/specs", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/lib/gcc/i686-linux-gnu/specs", R_OK) = -1 ENOENT (No such file or directory)
然后我创建自己的规范 getting build-in one 并将其放入上一步中获得的路径中:
serga@XXXXX:~$ sudo gcc -dumpspecs >/usr/lib/gcc/i686-linux-gnu/5/specs
我将-lpthread 一个一个插入到规范文件的*link:、*lib: 和*libgcc: 部分。在所有情况下,gcc 都可以在不明确提及 pthread 库的情况下构建程序:
serga@XXXXX:~$ gcc ./thread.c -o thread && echo "completed"
completed
明白了!!!
检测 gcc 是否使用任何额外的规范文件
需要看下一个的输出(我用的是gcc-5.1.0):
serga@XXXXX:~$ gcc -v 2>&1 | head -1
-
如果 gcc 使用特定文件中的规范,您将看到下一个:
Reading specs from /usr/lib/gcc/i686-linux-gnu/5/specs
-
否则:
Using built-in specs.
您可以看到这样做的内置规范:
serga@XXXXX:~$ gcc -dumpspecs
默认检测是否与pthread链接
需要查看获取的规范文件中与链接器相关的部分中-lpthread 的任何外观。
Spec file reference