用 GCC 编译使用了 POSIX thread 的程序时通常需要加额外的选项,以便使用 thread-safe 的库及头文件,一些老的书里说直接增加链接选项 -lpthread
就可以了,像这样:
1 | $ gcc -c x.c |
而 GCC 手册里则指出应该在编译和链接时都增加 -pthread
选项,像这样:
1 | $ gcc -pthread -c x.c |
那么 -pthread
相比于 -lpthread
链接选项究竟多做了什么工作呢?我们可以在 verbose 模式下执行一下对应的 GCC 命令行看出来。下面是老式的直接加 -lpthread
链接选项的输出结果:
1 | $ gcc -v -c x.c |
下面是在编译和链接时分别指定 -pthread
选项的输出结果:
1 | $ gcc -v -pthread -c x.c |
可见编译选项中指定 -pthread
会附加一个宏定义 -D_REENTRANT ,该宏会导致 libc 头文件选择那些 thread-safe 的实现;链接选项中指定 -pthread
则同 -lpthread
一样,只表示链接 POSIX thread 库。由于 libc 用于适应 thread-safe 的宏定义可能变化,因此在编译和链接时都使用 -pthread
选项而不是传统的 -lpthread
能够保持向后兼容,并提高命令行的一致性。