我在放置时遇到一些问题-l
使用时的选项gcc
。这是一个用于重现问题的精简版本。
t.c:
#include <pthread.h>
int main() {
pthread_create(0, 0, 0, 0);
}
并在终端中:
$ gcc -lpthread t.c
/tmp/ccmkwV7B.o: In function `main':
t.c:(.text+0x29): undefined reference to `pthread_create'
collect2: ld returned 1 exit status
$ gcc t.c -lpthread
$ (compiles ok)
为什么我必须把-lpthread
到底要使其发挥作用吗?而且这个问题似乎只出现在32位linux上。
我的环境信息附在下面:
gcc -lpthread t.c
在这台机器上失败。
$ gcc --version
gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
$ uname -rm
3.0.0-12-generic i686
gcc -lpthread t.c
在这台机器上工作。
$ uname -rm
2.6.18-274.3.1.el5 x86_64
$ gcc --version
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-51)
我查阅了 gcc 手册,它说“-l 的位置很重要”。它到底是什么意思?
来自manual http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html,
在命令中编写此选项的位置会有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,foo.o -lz bar.o
搜索图书馆z
文件后foo.o
但之前bar.o
. If bar.o
指的是函数z
,这些函数可能不会被加载。
这意味着链接库首先在 gcc 4.1.2 上工作是非常有趣的。这可能与编译器链接的默认库有关。我知道在某些安装中我不需要显式链接到 pthreads。
经过进一步思考,我认为问题出在旗帜上--as-needed
,在您的 gcc 4.6 系统中可能默认打开。看到这个link http://www.gentoo.org/proj/en/qa/asneeded.xml进行一些讨论。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)