gcc中-pthread和-lpthread的区别
用gcc編譯使用了POSIX thread的程序時(shí)通常需要加額外的選項(xiàng),以便使用thread-safe的庫(kù)及頭文件,一些老的書(shū)里說(shuō)直接增加鏈接選項(xiàng) -lpthread 就可以了,像這樣:
Shell代碼 ?- gcc?-c?x.c??
- gcc?x.o?-ox?-lpthread??
?而gcc手冊(cè)里則指出應(yīng)該在編譯和鏈接時(shí)都增加 -pthread 選項(xiàng),像這樣:
Shell代碼 ?- gcc?-pthread?-c?x.c??
- gcc?x.o?-ox?-pthread??
?那么 -pthread 相比于 -lpthread 鏈接選項(xiàng)究竟多做了什么工作呢?我們可以在verbose模式下執(zhí)行一下對(duì)應(yīng)的gcc命令行看出來(lái)。下面是老式的直接加 -lpthread 鏈接選項(xiàng)的輸出結(jié)果:
Shell代碼 ?- $?gcc?-v?-c?x.c??
- ...??
- /usr/lib/gcc/i486-linux-gnu/4.2.4/cc1?-quiet?-v?x.c?-quiet?-dumpbase?x.c??
- -mtune=generic?-auxbase?x?-version?-fstack-protector?-fstack-protector?-o?/tmp/cch4ASTF.s??
- ...??
- as?--traditional-format?-V?-Qy?-o?x.o?/tmp/cch4ASTF.s??
- ...??
- $?gcc?-v?x.o?-ox?-lpthread??
- ...??
- ?/usr/lib/gcc/i486-linux-gnu/4.2.4/collect2?--eh-frame-hdr?-m?elf_i386?--hash-style=both??
- -dynamic-linker?/lib/ld-linux.so.2?-ox??
- /usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib/crt1.o??
- /usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib/crti.o??
- /usr/lib/gcc/i486-linux-gnu/4.2.4/crtbegin.o??
- -L/opt/intel/Compiler/11.1/046/tbb/ia32/cc4.1.0_libc2.4_kernel2.6.16.21/lib/../lib??
- -L/usr/lib/gcc/i486-linux-gnu/4.2.4??
- -L/usr/lib/gcc/i486-linux-gnu/4.2.4??
- -L/usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib??
- -L/lib/../lib??
- -L/usr/lib/../lib??
- -L/opt/intel/Compiler/11.1/046/lib/ia32??
- -L/opt/intel/Compiler/11.1/046/tbb/ia32/cc4.1.0_libc2.4_kernel2.6.16.21/lib??
- -L/usr/lib/gcc/i486-linux-gnu/4.2.4/../../..??
- x.o?-lpthread?-lgcc?--as-needed?-lgcc_s?--no-as-needed?-lc?-lgcc??
- --as-needed?-lgcc_s?--no-as-needed??
- /usr/lib/gcc/i486-linux-gnu/4.2.4/crtend.o?/usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib/crtn.o??
?下面是在編譯和鏈接時(shí)分別指定 -pthread 選項(xiàng)的輸出結(jié)果:
Shell代碼 ?- $?gcc?-v?-pthread?-c?x.c??
- ...??
- /usr/lib/gcc/i486-linux-gnu/4.2.4/cc1?-quiet?-v?<strong>-D_REENTRANT</strong>??
- ?x.c?-quiet?-dumpbase?x.c??
- -mtune=generic?-auxbase?x?-version?-fstack-protector?-fstack-protector?-o?/tmp/cc205IQf.s??
- ...??
- as?--traditional-format?-V?-Qy?-o?x.o?/tmp/cc205IQf.s??
- ...??
- $?gcc?-v?x.o?-ox?-pthread??
- /usr/lib/gcc/i486-linux-gnu/4.2.4/collect2?--eh-frame-hdr?-m?elf_i386?--hash-style=both??
- -dynamic-linker?/lib/ld-linux.so.2?-ox??
- /usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib/crt1.o??
- /usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib/crti.o??
- /usr/lib/gcc/i486-linux-gnu/4.2.4/crtbegin.o??
- -L/opt/intel/Compiler/11.1/046/tbb/ia32/cc4.1.0_libc2.4_kernel2.6.16.21/lib/../lib??
- -L/usr/lib/gcc/i486-linux-gnu/4.2.4??
- -L/usr/lib/gcc/i486-linux-gnu/4.2.4??
- -L/usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib??
- -L/lib/../lib??
- -L/usr/lib/../lib??
- -L/opt/intel/Compiler/11.1/046/lib/ia32??
- -L/opt/intel/Compiler/11.1/046/tbb/ia32/cc4.1.0_libc2.4_kernel2.6.16.21/lib??
- -L/usr/lib/gcc/i486-linux-gnu/4.2.4/../../..??
- x.o?-lgcc?--as-needed?-lgcc_s?--no-as-needed?<strong>-lpthread</strong>??
- ?-lc?-lgcc??
- --as-needed?-lgcc_s?--no-as-needed??
- /usr/lib/gcc/i486-linux-gnu/4.2.4/crtend.o?/usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib/crtn.o??
?可見(jiàn)編譯選項(xiàng)中指定 -pthread 會(huì)附加一個(gè)宏定義 -D_REENTRANT,該宏會(huì)導(dǎo)致 libc 頭文件選擇那些thread-safe的實(shí)現(xiàn);鏈接選項(xiàng)中指定 -pthread 則同 -lpthread 一樣,只表示鏈接 POSIX thread 庫(kù)。由于 libc 用于適應(yīng) thread-safe 的宏定義可能變化,因此在編譯和鏈接時(shí)都使用 -pthread 選項(xiàng)而不是傳統(tǒng)的 -lpthread 能夠保持向后兼容,并提高命令行的一致性。
總結(jié)
以上是生活随笔為你收集整理的gcc中-pthread和-lpthread的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 割双眼皮多少钱啊啊?
- 下一篇: 历史是谁写的呢?