2022年如何交叉编译应用程序 .pdf

上传人:Che****ry 文档编号:34290037 上传时间:2022-08-15 格式:PDF 页数:3 大小:40.34KB
返回 下载 相关 举报
2022年如何交叉编译应用程序 .pdf_第1页
第1页 / 共3页
2022年如何交叉编译应用程序 .pdf_第2页
第2页 / 共3页
点击查看更多>>
资源描述

《2022年如何交叉编译应用程序 .pdf》由会员分享,可在线阅读,更多相关《2022年如何交叉编译应用程序 .pdf(3页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、如何交叉编译应用程序,技巧,注意事项。最近大家都涉及交叉编译应用程序,感觉大家的路子有点偏, 觉得有必要纠正一下。一般的应用程序编译的步骤无外呼 ./configure &mak e &m akeinstall但是对于交叉编译不能照搬,尤其要注意不能轻易make install(当然如果指定了 - prefix 就无所谓了, 否则可能会覆盖标准路径的程序就惨了)这里有两个思路:1 对于刚开始交叉编译的人来说,往往很晕,总想借助 ./configure 后面加一堆参数来解决,比如 ./configure - -tar get=arm-9tdm i- linux-gnu - host=arm-9t

2、dmi-linux-gnu 来搞定 ,对于一般的小的程序来说,应该没有问题,而且也推荐大家这样用,但是要注意,这样作之前,先要 ./configure - -help |grep - host,看看有没有这样的选项,如果没有呢?想想也可能,如果程序的作者根本没有考虑到除了x86的平台呢?你只能自己改写Mak efile 了。所以 , ./configure 不是万能的, 而且语法很混乱, 不要指望 ./configure 给你作一切。而且局限很大。2 所以这个时候 , 就要求交叉编译的第二个层次,自己改写Mak efile , 想怎么改就怎么改, 灵活性最大 需要你开始就./configure

3、 一下, 跟平台有关的参数一律不加。./configur e 过后就会生成Makefile 了,里面的gcc 相关的参数,包括lib 的路径当然是x86下的了, 比如 /usr/local/lib/,/usr/lib/,/lib/ 什么的,改掉就是了。或者注释掉。 gcc要换成 arm-linux gcc一类的编译器,(如果不想每次都改, 参考下面的include prerules.m k的做法) ,总之,这要求你的Makefile 掌握的很熟练,思路就是边编译,发现问题,再改,即使一开始Makefile不熟练,到后来,也熟练了。是个练习Mak efile 的好方式。总之,我们最后要的就是Ma

4、kefile , 看你怎么能得到它。一个最标准的Mak efile(去掉很多无用的东西)通过./configure 生成的Makefile ,你会发现冗余的地方非常多,其实关键的地方,就那么20几条,可以试着精简一下,这样对程序的组织架构会熟悉的快一些,毕竟Makefile 反应了程序(具体就是.c 和 .h )之间的依赖关系 。openssh的Mak efile 我没有精简过(当然要精简也很容易), 举个telnetd 的例子,说明一下:- telnetd-#- -TOPDIR := $(shell /bin/pwd)TOPDIR := $(TOPDIR)/.#prerules.mk包含了这

5、些变量的定义,比如$CC, $CPP , $CXX , $CFLAGS 等等。#尽量不要在这里出现,CC= arm-linux- gcc这样的定义,扩展性不好, 尽量用全局变量, 便于管理和拓展。include $(TOPDIR)/prerules.mk#- -EXEC = telnetd#好的Makefile 都是这样写的, 也就是具体生成一个可执行文件或者 lib 库,需要哪些.o,这些.o会依据后面的 .c.o: 规则来编译出来的。OBJS = telnetd.o state.o termstat.o slc.o sys_term.outility.oglobal.o authenc.o

6、logwtm p.o logout.o#$(CC) 的编译选项,一般程序自己的带的,不要改它,而且一般都是+= , 不要用 = ,CFLAGS += - DEMBED - DPARANOID_TTYS-DUSE_TERMIO- DKLUDGELINEMODE- D_GNU_SOURCE-Wallifdef CONFIG_DEFAULTS_LIBC_UCLIBCLDLIBS:= -lutil$(LDLIBS)endifall: $(EXEC)很显然all 是最关键的了, 也要发在最开始的地方。这样m ak e 就相当于m ake all ,这是大家的潜规则。.c.o:$(CC)- c -o $

7、如果是应用程序的可执行文件,我们可以用ldd 命令来查看它需要哪些必要的库。具体的命令:refer ,http:/infomax/bbs/viewthr ead.php? tid= 52&extra=page%3D12看看需要哪些配置文件,也就是conf文件。其实如果想知道上面的这些,还有个办法, 就是先在pc上编译, 安装,./configure - prefix=/work/bob (改成你自己的目录即可) , m ake &m ake install ,看看/work/bob/ 下面到底生成了哪些file , 你不就心里有数了吗。先把你知道的应用程序可执行文件 copy到板子上去,执行一

8、下,如果缺少哪些库 , 屏幕上会打出来一些出错信息的。缺什么,就copy什么到板子上好了,多半缺的都是库(.so文件).如果还是莫名其妙的出什么问题(ps 结果就是没有该进程), 有可能是缺少什么配置文件,可以用strace来查查看:具体 strace的用法可以 refer :http:/infomax/bbs/viewthread.php?tid= 56&extr a=page% 3D1如果程序运行的结果和pc上不太一样 。 就要注意几个根本的问题了。1 板子的endian是什么类型的呢? x86 是littleendian, arm 的板子可能是littleendian ,也可能是big-

9、endian 的,如果是big-endian , 就要注意了。要在程序里面改, 添加什么 le32_to_cpu() 这样的函数来转换的。2对齐问题, x86和arm 的对齐处理方式是不一样的。3 中文的问题, 有些程序需要支持中文, 繁体, 什么的, pc上可以, 拿到板子上就不可以了。你要考虑一下 glibc库上面是否支持 locale ,libiconv 一类的库。生成动态链接库的一个例子,也是标准的Makefile#Start of Makefile#- -TOPDIR := $(shell /bin/pwd)TOPDIR := $(TOPDIR)/././include $(TOPD

10、IR)/prerules.mk#- -SRCS = download.c curl_err.cDownloadStatusQuery.cOBJS = download.o curl_err .o DownloadStatusQuery.oCFLAGS += - I././include - Wall # - g -ggdball: libdownload.so.1.0.0#test_main:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 3 页 - - - - - -

11、- - - # $(CC)$(CFLAGS)-I./././include/- o m ain main.c$(LIBS)- ldownload-L. -L./././lib%.o:%.c或者 .c.o: 均可$(CC)-c -o $(CFLAGS) $libdownload.so.1 .0.0 : $(OBJS)$(CC)-shared -Wl,-soname,libdownload.so.1.0-o libdownload.so.1 .0.0 $(OBJS)$(STRIP) libdownload.so.1.0.0rm -r f libdownload.so.1 .0rm -r f lib

12、download.soln -s libdownload.so.1 .0.0 libdownload.so.1.0ln -s libdownload.so.1 .0 libdownload.socp -afv libdownload.so*$(COMM_LIB_PATH)cp -f download_oper ation.h $(COMM_INC_PATH)cp -f oper ation.h $(COMM_INC_PATH)cp -r f curl $(COMM_INC_PATH)cp -f curl_err.h $(COMM_INC_PATH)cp -f DownloadStatusQue

13、ry.h$(COMM_INC_PATH)install:# copy到ramdisk里面就好了cp -afv libdownload.so*$(T_LIB)#用-afv 参数比较好,保证一模一样clean:rm -r f libdownload.so*rm -r f $(COMM_LIB_PATH)/libdownload.so*rm -r f $(COMM_INC_PATH)/download_operation.hrm -r f $(COMM_INC_PATH)/oper ation.hrm -r f $(COMM_INC_PATH)/curl/rm -r f $(COMM_INC_PAT

14、H)/curl_err .hrm -r f $(COMM_INC_PATH)/DownloadStatusQuery.hrm -r f *.o最后的时候, 解释一下:$(CC)-shared -Wl,-sonam e,libdownload.so.1 .0 - o libdownload.so.1.0.0$(OBJS)会得到文件, libdownload.so.1.0.0,我们通常要作两个链接ln -s libdownload.so.1.0.0libdownload.so.1.0(这个是在板子上运行的时候,一定要有的,because,-Wl,-sonam e,libdownload.so.1 .0 了,写死了。ln -s libdownload.so.1.0libdownload.so(这个是给别人链接的时候用的)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 3 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁