|
楼主 |
发表于 2012-10-19 22:01:08
|
显示全部楼层
自挖自结:
我当时遇到的问题是:ld -o xxx a.o b.a c.a 时,c.a里有外部符号(即需要调用a.o或b.a里的函数),而ld无法链接该外部符号
这几天看《Computer Systems: A Programmer's Perspective, 2nd ed.》这本书里,在链接一章找到了答案
原来ld在链接各个输入文件时,是有顺序的,如果c.a要引用b.a里的函数,那么要把b.a放到c.a之后,因为ld是顺序搜索各个输入文件里的符号表,如果它发现c.a里有未定义的外部符号,它不会自己回头去b.a里找,而是报错(因为c.a之后没有输入文件了,自然找不到这个外部符号)。
解决方法有2:
1。把b.a放在c.a之后,如果b和c相互引用,则不妨在b.a c.a之后再放一个b.a,即:
ld -o xxx a.o b.a c.a b.a
直到笨lcd能够找到所有外部符号为止
2。如果有这种相互引用的情况,以及使用的是更笨的autotool工具,你又不想在autoconf生成的makefile里手工来改链接语句,那还是把这些纠结在一起的文件都放一个库里吧
也就是说,相互调用文件放一个库。
快1年,居然找到答案了,开心。真心推荐这本书,虽然各方面都讲的比较浅,但很解释很多开发中的实际问题。 |
|