用gcc编译使用了POSIX thread的程序时通常需要加额外的选项,以便使用thread-safe的库及头文件,一些老的书里说直接增加链接选项 -lpthread 就可以了,像这样:
gcc -c x.c
gcc x.o -ox -lpthread
而gcc手册里则指出应该在编译和链接时都增加 -pthread 选项,像这样:
gcc -pthread -c x.c
gcc x.o -ox -pthread
那么 -pthread 相比于 -lpthread 链接选项究竟多做了什么工作呢?我们可以在verbose模式下执行一下对应的gcc命令行看出来。下面是老式的直接加 -lpthread 链接选项的输出结果:
$ 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
下面是在编译和链接时分别指定 -pthread 选项的输出结果:
$ gcc -v -pthread -c x.c
...
/usr/lib/gcc/i486-linux-gnu/4.2.4/cc1 -quiet -v -D_REENTRANT
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 -lpthread
-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
可见编译选项中指定 -pthread 会附加一个宏定义 -D_REENTRANT
,该宏会导致 libc 头文件选择那些thread-safe的实现;链接选项中指定 -pthread 则同 -lpthread 一样,只表示链接 POSIX thread 库。由于 libc 用于适应 thread-safe 的宏定义可能变化,因此在编译和链接时都使用 -pthread 选项而不是传统的 -lpthread 能够保持向后兼容,并提高命令行的一致性。
分享到:
相关推荐
- 多线程支持:GCC内置了对POSIX线程(pthread)的支持,通过`-lpthread`链接库可以实现多线程编程。 总的来说,GCC 4.4.7是软件开发中的关键工具,尤其对于Linux环境下的C/C++编程。它的使用、配置和优化是每个...
编译此程序,使用`gcc example1.c -lpthread -o example1`命令,运行会得到不确定的输出,因为主线程和子线程都在争夺CPU资源。`pthread_create()`函数用于创建新线程,其四个参数分别是线程ID的指针、线程属性...
在Linux系统中,`-lpthread` 是一个链接器选项,用于链接到pthread库,它是Posix线程库(POSIX Threads)的实现,提供了一种跨平台的多线程编程接口。当编译或链接C/C++程序时,如果程序中使用了线程相关的功能,如`...
用于链接指定的库,如`-lpthread`链接pthread库。GCC会自动添加相应的.so动态库或.a静态库。 9. **-c或--compile-only** 只进行编译,不链接生成可执行文件。这在创建目标文件(.o文件)时使用。 10. **-o或--...
12. **多线程编程**:GCC对POSIX线程库(pthread)有良好的支持,通过`-lpthread`链接线程库,实现多线程程序。 通过深入学习GCC中文手册,开发者能够充分利用GCC的特性,提高代码质量,优化程序性能,更好地进行跨...
在这个命令中,`-L.`指定了库文件所在的目录,`-lpthread`和`-lc`分别链接了`pthread`和`libc`库。 在实际应用中,可能会遇到一些问题,如链接错误、符号未定义等,这通常需要检查静态库是否完整,或者编译选项是否...
工作队列 C++11 线程作业队列 ##目的 C++11 缺少线程池实现,默认情况下, std::async将为大多数实现中的每个工作单元生成一个新线程。 这是一个不幸的情况。... -std=c++11 -Wall -pthread -lpthread
2. `-lpthread`:链接多线程库pthread。 3. `-l<库名>`:链接其他特定的库。 ### GCC的预处理、编译、汇编和链接过程 GCC的完整编译过程包括预处理(cpp)、编译(cc1)、汇编(as)和链接(ld)四个阶段。预处理...
3. 在编译命令行中,添加`-lrt`和`-lpthread`选项,例如:`gcc my_program.c -o my_program -lrt -lpthread`。 4. 确认链接的库文件路径正确,特别是对于非标准位置的库,可能需要使用`-L`选项指定库路径。 5. 如果...
消费者问题实时嵌入式系统:第一次分配使用pthread的生产者-消费者问题安装与执行执行版本 gcc -o s prod-cons.c -lpthread -lm -std=gnu99 -std=c99 -O3 ./s统计信息文件包含三个文本以及运行的总体统计信息和计算...
此外,GCC还支持多种多线程编程模型,如POSIX线程(pthread),通过`-lpthread`链接线程库。对于国际化和本地化,GCC支持`gettext`库,允许程序根据用户的语言环境显示正确的文本。 总之,理解GCC和动态共享库在...
GCC内置对POSIX线程(pthread)的支持,开发者可以利用`-lpthread`选项链接线程库,实现多线程编程。 **小技巧8:并行编译** 通过`-j`参数,GCC可以并行编译多个源文件,加快整体编译速度。 **小技巧9:链接时优化...
GCC通过`-l`选项链接库,如`-lpthread`链接pthread库。库文件通常位于系统路径下的lib目录,而头文件位于include目录。 6. **静态库与动态库**:GCC可以选择生成静态库(`-shared`)或动态库(`-static`)。静态库会将...
**GCC(GNU Compiler Collection)是Linux和开源世界中广泛使用的C、C++、Objective-C、Fortran、Ada和Go等编程语言的编译器。它提供了丰富的编译选项,可以帮助开发者进行代码优化、调试、错误检查等。在实际工作中...
为防止数据竞争,使用了`pthread_mutex_lock`和`pthread_mutex_unlock`对修改操作进行加锁和解锁。 此外,程序还展示了如何使用`sleep`函数来模拟长时间操作或等待。 在执行程序时,可以看到两个线程交替输出各自...
Linux 下用C语言写的贪吃蛇 用到了 pthread 和curses 用gcc -lpthread -lcurses 编译
linux下 c语言写的俄罗斯方块 用到了 pthread和curses 要用gcc -lpthread -lcurses编译
`-lpthread`是链接到静态库libpthread.a或动态库libpthread.so的标志,而`-pthread`是GCC和Clang的编译选项,它会在编译时自动添加必要的链接标志,通常等同于`-lpthread`,但有时可能更合适。 3. **`target_link_...
要运行这些源代码,用户需要安装相应的编译器(如GCC),并使用编译命令(如`gcc server2.c -o server2 -lpthread` 和 `gcc client2.c -o client2 -lpthread`)将它们编译成可执行文件。然后,按照程序的设计,启动...
-lpthread,多线程使用,lpthread是表示要连接到pthread的库是这里省略的lib,可在共享库找到libpthread.so 1、安装编译器gcc & g++ yum install gcc //安装gcc yum install gcc-c++ //安装g++