免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 3454 | 回复: 7

[学习分享] 交叉编译与动态库 [复制链接]

论坛徽章:
0
发表于 2015-11-24 11:26 |显示全部楼层
       今天交叉编译了一个程序,交叉编译顺利通过,但是在程 序执行的时候,出现了一个问题can not resolve symble ‘XXX’。经过上网查看,大家遇到类似的问题是因为缺少动态库文件。所以我有几个困惑1.既然交叉编译可以通过,说明在相应的交叉编译环境下相应的库函数都是存在的。2.既然这样,交叉编译时用的库的路径是什么,是只搜索交叉编译工具链下的lib,还是也会搜索本地的/lib和/user/lib。3.如果也会搜索本地下的/lib和/user/lib,而交叉编译用到了本地的动态库,那么交叉编译编译出来的可执行文件,在其运行平台上又怎么去确定相应平台上的动态库的链接问题,如果该库存在还好,比如我这次遇到的问题,怎么确定是缺什么库呢

论坛徽章:
0
发表于 2015-11-27 15:46 |显示全部楼层
1) 编译的时候,只有有头文件就够了。 link阶段才需要so库。

2) 交叉编译正常情况下,是不会搜索本地标准库的。
     具体看你的交叉编译工具链是如何配置,一般情况下,除了gcc 这样的一些系统核心库,其它第三方库,你可指定一个路径。 交叉编译结束后,这些库需要放到目标平台上面。

3) 想知道是缺什么库,就看你对系统的了解程度了。 根据缺少的API函数, 找到对应的头文件,然后,再通过头文件,或者网上搜索下,都能找到是属于那个库的。
    对缺少的库,你需要找到源码,进行交叉编译成你目标平台的库。


论坛徽章:
0
发表于 2015-12-10 10:52 |显示全部楼层
谢谢你,你说的对,交叉编译应该是不会用到系统库。在交叉编译的过程中应该有链接的过程是不是,交叉编译通过,说明在交叉编译的过程中不缺少动、静态库,但是放到相应平台上就缺,我的设想是把交叉编译工具链里lib文件夹下的库放到目标平台的lib里,这样应该就不缺了,无奈没办法验证,因为是个只读系统,不能写入库。

论坛徽章:
0
发表于 2016-01-11 11:13 |显示全部楼层
交叉编译的时候,如果不缺少库,而运行的时候缺少,只需要把 交叉编译环境想要的库,放到目标环境就可以了。

论坛徽章:
0
发表于 2016-01-18 16:26 |显示全部楼层
谢谢回复 4# kartorz


   

论坛徽章:
0
发表于 2016-01-19 14:18 |显示全部楼层
你在编译的时候的确是加了 -lxxxx 这种的链接库信息
这样编译器就会在生成的代码中加入对应的函数入口地址或符号
当你的程序到了实际环境中运行的时候,就会去寻找这个符号,如果发现缺少了该符号,那就会提示出错
在linux下,shell会提醒你缺少的.so 叫什么名字的

论坛徽章:
0
发表于 2018-08-01 15:17 |显示全部楼层
不知道这个回答是否迟到希望也能帮助其他人:
1.交叉编译需要的c标准库和头文件就在交叉编译工具的目录中,去交叉编译工具的压缩包解压的目录找,编译的时候需要加-I -L 指定路径。
2.第三方动态库也需要编译时加-L指定路径。
3.以上的动态库(标准库和第三方库)需要事先放到目标机(开发板等)中的某个目录下,或者直接放入系统默认的动态库搜索的目录,如果你放在某个目录下而非系统默认的动态库搜索目录,那么你需要添加动态库搜索路径(具体可以网上搜很多)。
4.将可执行文件copy到目标机执行就ok了。
编译是这样的过程:1预处理生成.i文件2编译生成.s文件3汇编生成.o文件4链接生成可执行文件。动态链接库就是在链接的时候使用的只起到运行时头文件中的函数声明能找到对应的库中的函数定义,并没有被编译器加入到可执行文件中去。静态库是被编译进可执行文件中的。头文件的搜索是在预处理阶段完成的(所有带#的都是预处理完成),预处理阶段就是把头文件中的代码加入本次编译过程。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP