|
|
多线程不可静态编译?
|
|
我在一嵌入应用中使用了多线程,她在桌面系统中动态编译成功,但我必须静态编译以移入微型嵌入系统中。在连接时报错。
我使用的选项:
gcc -static -pthread -O2 xxx.c
在遇到所有pthread_函数时报:
undefined reference to 'pthread_xxx'
各位高手请指点。
|
|
|
Re: 多线程不可静态编译?
|
|
gcc -static -O2 -o xxx xxx.c -lpthread
试试
|
|
|
谢谢,问题解决了。只是不明白?
|
|
只是我不明白:
gcc -static -O2 -lpthread -o xxx xxx.c
与
gcc -static -O2 -o xxx xxx.c -lpthread
会有如此大的差距
而
gcc -lpthread -O2 -o xxx xxx.c
与
gcc -O2 -o xxx xxx.c
又都能编译成功。
|
|
|
Re: 谢谢,问题解决了。只是不明白?
|
|
16.3 链接过程中库的顺序
Q: 有几个库文件A.a、B.a、common.a,前两者用到了定义在后者中的例程,如果把
common.a放在前面,链接器报告存在无法解析的符号名,放在最后则无问题。
A: Floyd Davidson <floyd@ptialaska.net>
链接器按照命令行上指定顺序搜索库文件和目标文件(.a .o),二者之间的区别在
于.o文件被全部链接进来,而只从库文件中析取所需模块,仅当某个模块可以解
析当前尚未成功解析的符号时,该模块被析取后链接进来。如果库文件无法解析
任何当前尚未成功解析的符号,不从中析取也不发生链接。
Unix编程新手的常见问题是数学函数并不在标准C库中,而是在libm.a中
cc -lm foo.c
这里foo.c用到了数学库中的符号,但是链接器无法正确解析。当搜索到libm.a时,
来自foo.c的数学函数符号尚未出现,因此不需要析取libm.a的任何模块。接下来
foo.o链接进来,增加了一批尚未成功解析的符号,但已经没有libm.a可供使用了,
因此数学库必须在foo.o之后被搜索到。
cc foo.c -lm
在你的问题中,如果common.a首先被搜索到,因为不匹配尚未成功解析的符号,
而被丢弃。结果A.a和B.a真正链接进来的时候,已经没有库可以解析符号了。
D: 注意这里说的是静态库,对于动态库则有所不同。
|
|
|
Re: 谢谢,问题解决了。只是不明白?
|
|
库的顺序很重要,另外.so可以看作是object文件,而.a是库(object文件的集合),连接时的处理方式非常不同。
|