Linux的交叉编译 及configure配置
这两天需要把一个CDVS的工程代码从Linux 平台上移植到ARM平台上,花了两天才搞定,之前很早申请的博客,到现在还没有技术文章会,以后决定凡是花两三天才搞定的东西都会把解决过程发到这里,很多东西靠百度什么的不太好使,必要的时候确实Google更好用。想想也是,在百度上搜,很多都是迄今为止中国程序员碰到过的问题,在Google上搜就是全世界程序员碰到过的问题。废话不多说了,切入正题。
由于原工程已经在PC-Linux上跑通,所以只需要修改configure的配置参数即可。这里我通过linux下的build.sh来对configure传入脚本。
下面试build.sh的脚本内容:
#!/bin/sh
# build the CDVS Test Model
# with full optimizations and multithreading:
CFLAGS="-march=armv7-a -O2 -DNDEBUG -fopenmp -pipe"
export PATH=$PATH:/usr/local/arm/arm-hik_v7a-linux-uclibcgnueabi/bin
# run configure with optimization flags and prepending "tm-" to all binaries (e.g. tm-extract, tm-match, etc.)
mkdir -p build
cd build
CC=arm-hik_v7a-linux-uclibcgnueabi-gcc CXX=arm-hik_v7a-linux-uclibcgnueabi-c++ LD=arm-hik_v7a-linux-uclibcgnueabi-ld AR=arm-hik_v7a-linux-uclibcgnueabi-ar AS=arm-hik_v7a-linux-uclibcgnueabi-as NM=arm-hik_v7a-linux-uclibcgnueabi-nm STRIP= RANLIB=arm-hik_v7a-linux-uclibcgnueabi-strip OBJDUMP=arm-hik_v7a-linux-uclibcgnueabi-objdump ../configure --build=i386-pc-linux-gnu --host=arm-hik_v7a-linux-uclibcgnueabi --target=arm-hik_v7a-linux-uclibcgnueabi --cache-file=arm-hik_v7a-linux-uclibcgnueabi.cache prefix=$HOME/cdvs_bin_for_arm --program-prefix="tm-" CFLAGS="${CFLAGS}" CXXFLAGS="${CFLAGS}"
# build all binaries
make
# install all binaries in $HOME/bin (no need of admin priviledges)
make install
对脚本的内容进行分析:
首先是CFLAGS,里面定义了需要传入到configure的参数这里的-march变量是目标机的系统架构也就是architecture,由于我们的目标机上平台是armv7-a,所以此处赋值armv7-a。此处要留心,我一开始没有改,依然是native,那么configure会自动的用本机的arch值传入,这样就会编译失败。我一开始也不清楚这个地方具体应该填什么。这样我们可以查看编译器支持的芯片类型。
我的编译器的前缀是arm-hik_v7a-linux-uclibcgnueabi,所以这是这个编译器下所有工具的前缀。
由于交叉编译器已经安装在/usr/local/arm目录下,并且已经把/uar/local/arm/arm-hik_v7a-linux-uclibcgnueabi/bin目录添加到/etc/profile文件中,所以在控制台中可以直接调用编译器。
在控制台中我们输入arm-hik_v7a-linux-uclibcgnueabi-gcc -v 此命令会输出该编译器的版本信息

在输出图片中我们可以看到变量--with-arch=armv7-a,一开始输成了ARMv7-A,各种乱试,确实需要从根源下手,直接查看编译器版本信息。OK,接下来进入下一步。
可以看到脚本中还有一句PATH=$PATH:/usr/local/arm/arm-hik_v7a-linux-uclibcgnueabi/bin 这是对当前脚本执行的环境加上环境变量,不知道为什么在系统中添加环境变量后还是脚本运行时不能检索到编译器位置,一直报错,可以看config.log的输出日志。
PATH: /usr/local/sbin
PATH: /usr/local/bin
PATH: /usr/sbin
PATH: /usr/bin
PATH: /sbin
PATH: /bin
在这里并没有将我们环境变量的值给读进来,
而我打开终端中直接打印PATH,发现值已经在里面了。此处不太明白,所以我在build.sh里又中添加了export语句在临时追加环境变量。
louyihang@ubuntu:~$ echo $PATH
/home/louyihang/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/arm-hik_v7a-linux-uclibcgnueabi/bin:/usr/local/arm/arm-hik_v7a-linux-uclibcgnueabi/bin
接着我们在当前目录下用mkdir 创建build文件夹,整个编译过程中的各种输出文件都将会在这里除了最后的exe。
在下面可以看到我定义了一堆变量,用来指定编译器
CC=arm-hik_v7a-linux-uclibcgnueabi-gcc CXX=arm-hik_v7a-linux-uclibcgnueabi-c++ LD=arm-hik_v7a-linux-uclibcgnueabi-ld AR=arm-hik_v7a-linux-uclibcgnueabi-ar AS=arm-hik_v7a-linux-uclibcgnueabi-as NM=arm-hik_v7a-linux-uclibcgnueabi-nm STRIP= RANLIB=arm-hik_v7a-linux-uclibcgnueabi-strip OBJDUMP=arm-hik_v7a-linux-uclibcgnueabi-objdump ../configure --build=i386-pc-linux-gnu --host=arm-hik_v7a-linux-uclibcgnueabi --target=arm-hik_v7a-linux-uclibcgnueabi --cache-file=arm-hik_v7a-linux-uclibcgnueabi.cache prefix=$HOME/cdvs_bin_for_arm --program-prefix="tm-" CFLAGS="${CFLAGS}" CXXFLAGS="${CFLAGS}"
CC变量指定的是gcc编译器,可以在configure文件中得知这个变量来告诉configure关于交叉编译器gcc的信息,同理CXX 指的是C++,只要前缀不变,所以接下来依样画葫芦把所需要用到的编译器直接定义在 configure语句执行之前。
CC=arm-hik_v7a-linux-uclibcgnueabi-gcc CXX=arm-hik_v7a-linux-uclibcgnueabi-c++ LD=arm-hik_v7a-linux-uclibcgnueabi-ld AR=arm-hik_v7a-linux-uclibcgnueabi-ar AS=arm-hik_v7a-linux-uclibcgnueabi-as NM=arm-hik_v7a-linux-uclibcgnueabi-nm STRIP= RANLIB=arm-hik_v7a-linux-uclibcgnueabi-strip OBJDUMP=arm-hik_v7a-linux-uclibcgnueabi-objdump
需要注意的是其实你这些语句总共是4行,其实这里是没有回车的,因为这整个一长串都是一条语句,只不过在configure的的编译器参数需要再configure之前被设置。
OK这里弄完。接着看我们configure之后的参数。
--build参数指定的是编译器完成整个build的工程的机器结构在这里我们输入i386-pc-linux-gnu
--host参数指定最终生成可执行文件的运行环境 arm-hik_v7a-linux-uclibcgnueabi (也就是我们用的交叉编译器工具的前缀——即编译器的文件夹的名字 )这些都是一致的
--target参数目标机的环境等同host。
--cache-file在这里指定缓存文件的名字,在该文件中我们可以看到编译过程中的整个测试过程的结果和反馈。
--prefix=$Home/cdvs_bin_for_arm 这里是最终生成可执行文件的安装目录也就是exe的存放目录。可以根据自己的需要调整。
后面的--program-prefix CFLAGS CXXFLAGS的参数与linux PC机上一样不用调整。
OK最后在最后跟上make make install 完成整个configure的配置。
当然什么事情都不会跟教程一样顺利,接下来的问题总是不断。
在终端中输入 sudo ./build.sh | more
看输出内容

可以看到出现了 checking whether the C compiler works ...no 后面还出现了error。
看来 交叉编译器并没有开始工作。所以转入到build 文件夹下 打开config.log的输出日志。

看到一条语句 arm-hik_v7a-linux-uclibcgnueabi-gcc-raw: libgomp.spec: No such file or directory
很明显这是由于库里少了一个文件,没有被编译器找到,所以需要再库里面添加进liggomp.spec这个文件。
当时把我迷糊了好久,上哪里去整个这个文件,上百度也百度不到,上google也不好使。
想到他毕竟是个gcc的编译器,库里面的东西大概都差不多吧,所以我去找了标准的arm-linux-gcc的库文件,记得当时的百度云里还有一份stm32的资料,整了一个下来。

打开这个arm-linux-gcc-4.4.3.tgz直接在压缩包里面检索关键字libgomp
果然在这个编译器同样的lib下有了一堆跟libgomp相关的文件,所以把这些文件拷入到我们所需要的arm-hik_v7a-linux-uclibcgnueabi的编译器库下面
OK再运行一次configure

咦,居然还是不过,再次看config.log文件

看到中间有一句 lib/libgomp.so: file not recognized: treating as linker script 和下面 lib/libgomp.so:1: syntax error。 不识别,这文件应该是不需要的被引入了,所以在Lib中将其删除。再次运行

OK 大功告成,可以看到whether the C compiler works .... yes 接下来一堆文件的测试,并且在指定目录生成了exe。
整个过程花了差不多2天时间,第一次弄交叉编译,确实是有点费劲的,也发现了一些自己的不足,之前没有看log文件的习惯,后来发现这个东西是非常好的,非常有助于我们分析问题的原因。第一次写blog,写的比较乱,希望能帮到碰到同样问题的你!
Linux的交叉编译 及configure配置的更多相关文章
- 关于Linux的交叉编译环境配置中的问题
Linux的交叉编译arm-linux-gcc搭建时,安装结束却无法查看版本.输入以下命令查看Ubuntu的版本: uname -a 可以看到此Ubuntu为64位16.04.1版本,所以需要下载32 ...
- 【转】linux 编译安装nginx,配置自启动脚本
linux 编译安装nginx,配置自启动脚本 本文章来给各位同学介绍一篇关于linux 编译安装nginx,配置自启动脚本教程,希望有需要了解的朋友可一起来学习学习哦. 在公司的suse服务器装ng ...
- Linux版OpenVPN安装、配置教程(转)
本文将以目前最新的openvpn-2.3.4.tar.gz(更新于2014-5-2,下载地址)为例来介绍如何在Linux系统中安装.配置及使用OpenVPN. 在这里,我们选用了一台预装CentOS ...
- linux 编译安装nginx,配置自启动脚本
本文章来给各位同学介绍一篇关于linux 编译安装nginx,配置自启动脚本教程,希望有需要了解的朋友可一起来学习学习哦. 在公司的suse服务器装nginx,记录下安装过程: 参照这篇文章:Linu ...
- configure配置脚本的使用
Linux下软件的安装一般由3个步骤组成: ./configure --host=arm-linux ... //配置 make //编译 make install //安装 若取消编译: make ...
- Linux FreeTDS的安装与配置
Linux FreeTDS的安装与配置 一.简介 官方网站:http://www.freetds.org 版本:0.64 下载地址:http://ibiblio.org/pub/Linux/ALPHA ...
- Linux下的Nginx的配置+Tomcat启动
Linux下的Nginx的配置 首次如果你只仅主机模式,那么请你切换到桥接模式或者net模式. 1.安装编译工具及库文件 yum -y install make zlib zlib-devel gcc ...
- Linux中Nginx安装与配置详解
转载自:http://www.linuxidc.com/Linux/2016-08/134110.htm Linux中Nginx安装与配置详解(CentOS-6.5:nginx-1.5.0). 1 N ...
- Linux装机利器Cobbler安装配置
Linux装机利器Cobbler安装配置 2011-05-27 15:31:05 分类: LINUX 一.安装环境 centos 5.4 关掉iptables 关掉 selinux selinux ...
随机推荐
- 行转列一定要sum
--SELECT 姓名 ,-- 课程 ,-- 分数--FROM tb UNPIVOT ( 分数 FOR 课程 IN ( [语文], [数学], [物理] ) ) t --)
- python中的__init__ 、__new__、__call__小结
这篇文章主要介绍了python中的__init__ .__new__.__call__小结,需要的朋友可以参考下 1.__new__(cls, *args, **kwargs) 创建对象时调用,返回 ...
- Java-链表LinkedList源码原理分析,并且通过LinkedList构建队列
在这里我们介绍一下最简单的链表LinkedList: 看一下add()方法: public boolean add(E e) { linkLast(e); return true; } void li ...
- Orchard中文版源码下载
本版本基于Orchard1.7.2修改: 新增Bootstrap主题 新增中文语言包 增加了对Sqlite.Orchard数据库的支持 优化工程,减少临时符号生成,增加工程效率 和一些BUG的修正 默 ...
- RadioButton 自定义控件
在res/drawable新建radiobutton.xml(本案例为video——evaluate.xml)如下 <?xml version="1.0" encoding= ...
- 【GOF23设计模式】迭代器模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_迭代器模式.JDK内置迭代器.内部类迭代器 package com.test.iterator; /** * 自定义的迭代 ...
- JAVA书写规范
java程序书写规范 命名规范 1.一般概念 1.尽量使用完整的英文描述符 2.采用适用于相关领域的术语 3.采用大小写混合使名字可读 4 ...
- 生理周期(c++实现)
描述:人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23 天. 28 天和33 天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,智力周期的高峰,人会思维 ...
- Vue条件渲染
gitHub地址:https://github.com/lily1010/vue_learn/tree/master/lesson08 一 v-if显示单个元素 注意else只能跟在v-if或者v-s ...
- WCF概念
WCF 概念 WCF是.NET Framework 上灵活通讯技术.在.NET 3.0推出之前,一个企业解决方案需要几种通讯方式.对于独立于平台的通讯,使用ASP.NET Web服务.对于比较高级的 ...