【Linux】gcc -pthread与gcc -lpthread的区别

当我们使用线程包(pthread)内的函数时,直接用gcc编译一定会出现如下的报错信息:

[admin@localhost day0720]$ gcc create.c 
/tmp/ccnWXVkV.o: In function `main':
create.c:(.text+0x49): undefined reference to `pthread_create'
collect2: ld returned 1 exit status

报错原因:pthread系列线程函数不在Linux下默认的函数库中,链接时无法找到pthreda中各函数的入口地址,导致链接失败。

解决方法:在链接上 -lpthread即可通过编译链接

[admin@localhost day0720]$ gcc create.c -lpthread
[admin@localhost day0720]$ ./a.out

一些书上也有写直接加上 -pthread参数即可

[admin@localhost day0720]$ gcc create.c -pthread
[admin@localhost day0720]$ ./a.out

通过编译链接,可发现两种方法都可解决上述问题,那么两者有什么区别呢?

1、-lpthread是较为老式的解决方法,pthread新加了对于宏D_REENTRANT的定义,-pthread会被展开为“-D_REENTRANT -lpthread”,它不仅可以链接pthread库,还可以打开系统头文件中的各种多线程支持分支,比如,我们常常使用的错误码标志errno,如果没有定义_REENTRANT,则实现为一个全局变量;若是定义了_REENTRANT,则会实现为每线程独有,从而避免线程竞争错误。

2、-pthread可移植性较强:在Linux中,pthread是作为一个单独的库存在的(libpthread.so),但是在其他Unix变种中却不一定,比如在FreeBSD中是没有单独的pthread库的,因此在FreeBSD中不能使用-lpthread来链接pthread,而使用-pthread则不会存在这个问题,因为FreeBSD的编译器能正确将-pthread展开为该系统下的依赖参数。同样道理,其他不同的变种也会有这样那样的区别,如果使用-lpthread,则可能在移植到其他Unix变种中时会出现问题,为了保持较高的可移植性,我们最好还是使用-pthread(尽管这种做法未被接纳成为C标准,但已基本是事实标准)。

---以上两条引自某前辈博客

猜你喜欢

转载自blog.csdn.net/lxf_style/article/details/81140042
gcc