搜索
bottom↓
回复: 3

linux下automake编译子模块之间不能相互链接的问题

[复制链接]

出0入0汤圆

发表于 2011-12-29 20:54:13 | 显示全部楼层 |阅读模式
MS大家都常用WINDOWS下的IDE,linux下比较少,还是要请教一下:

我自己用autotool写的ucosii ucgui工程,刚加入ucgui,目录结构如下:(所有库文件都是用arm-linux-gcc -c编译成.o后用ar打包成.a)
./ 主程序,自身只有一个head.S和test.c,调用ucgui中的启动函数测试用,编译成可执行文件armtests, 加了LDADD=../drv/libdrv.a ../kernel/libucosii.a ../gui/libucgui.a
drv/libdrv.a 底层BSP文件,如led, lcd
kernel/libucosii.a  UCOS所有文件,会调用drv下的led等函数。加了LIBADD=../drv/libdrv.a
gui/libucgui.a ucgui所有文件,会调用drv/lcd等函数,如果编译成带操作系统,还会调用kernel下的UCOS函数,加了LIBADD=../drv/libdrv.a ../kernel/libucosii.a
gui/guitest 测试裸跑gui的程序,同样调用ucgui中的启动函数测试用,修改的head.S和guitest.c。编译成可执行文件guitests, 同样加了LDADD=../drv/libdrv.a ../kernel/libucosii.a ../gui/libucgui.a

现在问题是:
./的主程序编译正常通过
gui/guitest测试程序无法链接,链接时报libucgui.a中调用的drv/lcd.o: lcd_set_pixel未定义符号

如果把UCGUI的OS选项打开,./下的主程序也会报libucgui.a中调用的OS函数是未定义符号

为什么啊。。。

源码在ubuntu 11.10下,arm-linux-gcc 2.95.3下编译


点击此处下载 ourdev_708822POEBF3.rar(文件大小:6.54M) (原文件名:arm-tests-1.0.rar)

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2011-12-30 13:32:32 | 显示全部楼层
审核通过,感谢莫版。顶一下


总结问题是:
1。autoconf/automake工具编译相互调用的子模块静态库时,在最后链接时库与库之间的调用会被认为是未定义,无法链接;
2。我自己在命令行里手动敲链接命令,确保参数顺序都完成和automake生成的一样,结果却是可以正常链接

见鬼了。。。 好容易入了一点autotool的门,结果还卡在这里,郁闷啊,特请教

出0入0汤圆

 楼主| 发表于 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年,居然找到答案了,开心。真心推荐这本书,虽然各方面都讲的比较浅,但很解释很多开发中的实际问题。

出0入0汤圆

发表于 2012-10-27 15:58:03 | 显示全部楼层
谢谢推荐书本...
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 20:00

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表