蓝森林首页 | 返回主页 | 本站地图 | 站内搜索 | 联系信箱 | -->
 您目前的位置:首页 > 自由软件 > 技术交流 > 应用编程 -->


    

蓝森林 http://www.lslnet.com 2006年8月16日 14:08

多线程不可静态编译?

我在一嵌入应用中使用了多线程,她在桌面系统中动态编译成功,但我必须静态编译以移入微型嵌入系统中。在连接时报错。
我使用的选项:
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文件的集合),连接时的处理方式非常不同。



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 蓝森林网站 版权所有。 E-mail : webmaster@lslnet.com