Linux的交叉编译 及configure配置

这两天需要把一个CDVS的工程代码从Linux 平台上移植到ARM平台上,花了两天才搞定,之前很早申请的博客,到现在还没有技术文章会,以后决定凡是花两三天才搞定的东西都会把解决过程发到这里,很多东西靠百度什么的不太好使,必要的时候确实Google更好用。想想也是,在百度上搜,很多都是迄今为止中国程序员碰到过的问题,在Google上搜就是全世界程序员碰到过的问题。废话不多说了,切入正题。

由于原工程已经在PC-Linux上跑通,所以只需要修改configure的配置参数即可。这里我通过linux下的build.sh来对configure传入脚本。

下面试build.sh的脚本内容:

 1 #!/bin/sh
 2 # build the CDVS Test Model
 3 # with full optimizations and multithreading:
 4 CFLAGS="-march=armv7-a -O2 -DNDEBUG -fopenmp -pipe"
 5 export PATH=$PATH:/usr/local/arm/arm-hik_v7a-linux-uclibcgnueabi/bin
 6 # run configure with optimization flags and prepending "tm-" to all binaries (e.g. tm-extract, tm-match, etc.)
 7 mkdir -p build
 8 cd build
 9 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}"
10 # build all binaries
11 make
12 # install all binaries in $HOME/bin (no need of admin priviledges)
13 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语句在临时追加环境变量。

[email protected]:~$ 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,写的比较乱,希望能帮到碰到同样问题的你!

时间: 2024-10-16 08:54:37

Linux的交叉编译 及configure配置的相关文章

Linux arm-linux交叉编译环境的配置

声明来自http://blog.csdn.net/lianyq1986/article/details/6651447 step:1.配置crosstool[[email protected] crosstool-ng-1.9.3]# ./configure --prefix=/opt/powerpc/install_dir/Checking for 'grep'... /bin/grepChecking whether '/bin/grep' supports -E... yesCheckin

linux下编译qt5.6.0静态库——configure配置

 随笔 - 116  文章 - 4  评论 - 7 linux下编译qt5.6.0静态库--configure配置 linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberry选项: Android 选项: 生成makefile 遇到链接检查失败的情况 生成makefile后进行编译 编译时的错误 多重定义'QT_MODBUS()'和'QT_MODBU

Linux之LAMP架构搭建配置

Linux之LAMP架构搭建配置 LAMP简介 LAMP定义指Linux(操作系统).ApacheHTTP 服务器,MySQL(有时也指MariaDB,数据库软件) 和PHP(有时也是指Perl或Python) 的第一个字母,一般用来建立web应用平台. 对于大流量.大并发量的网站系统架构来说,除了硬件上使用高性能的服务器.负载均衡.CDN 等之外,在软件架构上需要重点关注下面几个环节: 使用高性能的操作系统 (OS) . 高性能的网页服务器 (Web Server) .高性能的数据库(Data

Linux下apache+php搭建配置记录

linux下apache+php搭建配置记录 第1章  环境说明 1.1 系统说明 CentOS 6.4 1.2 软件说明 httpd-2.4.2.tar.gz apr-util-1.4.1.tar.gz apr-1.4.6.tar.gz pcre-8.13.tar.gz php-5.4.3.tar.bz2 libmcrypt-2.5.8.tar.gz mhash-0.9.9.9.tar.gz 第2章  Apache搭建说明 2.1 安装依赖包 yum install make openldap

Linux 下编译并安装配置 Qt 4.53全过程

最近准备做 Nokia 的 Symbian,Maemo 下触摸屏开发.考虑到程序的跨平台可移植性,最终选择使用 Qt 开发.相对来说,国内关于 Qt 相关文档并不算很多.作者将 Linux 下编译并安装配置 Qt 全过程总结了一下,只希望可以方便更多的朋友! 1.获得源代码         src 官网下载地址:ftp://ftp.qt.nokia.com/qt/source/        2009 年 10 月 1 日发布的 qt-x11-opensource-src-4.5.3.tar.g

Linux&&Windows文件同步简单配置[rsync]

1.Windows to Windows 1.1.所需软件:cwRsyncServer_4.1.0_Installer.zip 1.2.安装: 解压后,直接双击安装 此步骤为设置同步的帐户和密码,该步骤会在操作系统层面创建一个用户:SvcCWRSYNC.当然,我们也可以修改这个用户,自己设置密码,都可以. 但是Windows下面可以不设置,全部默认即可. 1.3.配置服务端 编辑文件:rsyncd.conf use chroot = false strict modes = false host

Linux中PHP安装与配置(CentOS-6.5:php-5.2.13)

1 PHP简介 PHP(PHP: Hypertext Preprocessor的缩写,中文名:"超文本预处理器")是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适用于Web开发领域.PHP的文件后缀名为php. 2 下载地址 1)libmcrpyt ftp://mcrypt.hellug.gr/pub/crypto/mcrypt/libmcrypt/libmcrypt-2.5.7.tar.gz 2) php http://ww

linux下交叉编译libcurl

linux下交叉编译libcurl: ./configure --prefix=/usr/local/arm-2014.05/lib/ CC=/usr/local/arm-2014.05/bin/arm-none-linux-gnueabi-gcc --host=arm-linux --disable-shared --enable-static --without-libidn --enable-ssl --without-librtmp --without-gnutls --without-

Linux下FTP虚拟账户配置

参考模版/usr/share/doc/vsftpd-2.0.5/EXAMPLE/VIRTUAL_USERS) 1.创建虚拟账户 [[email protected] ~]#yum install db4-utils [[email protected] ~]#vim /etc/vsftpd/vlogin tomcat #账户名称 123456 #密码 jerry #账户名称 654321 #密码 [[email protected] ~]#db_load -T -t hash -f /etc/v