-l gcc linux 编译

2014-10-10 21:49:26 mengfanteng 阅读数 1907

交叉编译工具arm-none-linux-gnueabi-gcc安装

http://wiki.emsym.com/wiki/%E6%90%AD%E5%BB%BALinux%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83#.E4.BA.A4.E5.8F.89.E7.BC.96.E8.AF.91.E5.B7.A5.E5.85.B7arm-none-linux-gnueabi-gcc.E5.AE.89.E8.A3.85

交叉编译工具arm-none-linux-gnueabi-gcc安装

点击下载

[编辑]打开终端

进入Ubuntu操作系统,依次选择“Applications(应用)”、“Accessories(附件)”、“Terminal(终端)”。shell终端界面如下图所示。


[编辑]下载arm-none-linux-gnueabi-gcc安装包

在Ubuntu操作系统中,可以使用自带的wget工具下载arm-none-linux-gnueabi-gcc安装包。

wget是一个非交互式的命令行工具,用于从网络上检索文件并自动下载,支持HTTP、HTTPS、FTP三个最常用的TCP/IP协议。

wget命令格式:

<span class="kw2" style="color:#c2cb9;font-weight:bold">wget</span> <span class="br0" style="color:#7a874;font-weight:bold">[</span>OPTION<span class="br0" style="color:#7a874;font-weight:bold">]</span> <span class="br0" style="color:#7a874;font-weight:bold">[</span>URL<span class="br0" style="color:#7a874;font-weight:bold">]</span>

在shell命令行下,输入以下命令并按<Enter>键执行,即可下载arm-none-linux-gnueabi-gcc安装包。

<span class="kw2" style="color:#c2cb9;font-weight:bold">wget</span> http:<span class="sy0" style="font-weight:bold">//</span>www.codesourcery.com<span class="sy0" style="font-weight:bold">/</span>sgpp<span class="sy0" style="font-weight:bold">/</span>lite<span class="sy0" style="font-weight:bold">/</span>arm<span class="sy0" style="font-weight:bold">/</span>portal<span class="sy0" style="font-weight:bold">/</span>package4571<span class="sy0" style="font-weight:bold">/</span>public<span class="sy0" style="font-weight:bold">/</span>arm-none-linux-gnueabi<span class="sy0" style="font-weight:bold">/</span>arm-2009q1-<span class="nu0">203</span>-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2


在下载的过程中完全可以按<Ctrl>+<c>退出下载,以后加上-c选项可以从断点处继续下载,如下所示。

<span class="kw2" style="color:#c2cb9;font-weight:bold">wget</span> <span class="re5" style="color:#66033;">-c</span> http:<span class="sy0" style="font-weight:bold">//</span>www.codesourcery.com<span class="sy0" style="font-weight:bold">/</span>sgpp<span class="sy0" style="font-weight:bold">/</span>lite<span class="sy0" style="font-weight:bold">/</span>arm<span class="sy0" style="font-weight:bold">/</span>portal<span class="sy0" style="font-weight:bold">/</span>package4571<span class="sy0" style="font-weight:bold">/</span>public<span class="sy0" style="font-weight:bold">/</span>arm-none-linux-gnueabi<span class="sy0" style="font-weight:bold">/</span>arm-2009q1-<span class="nu0">203</span>-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

[编辑]解压arm-none-linux-gnueabi-gcc安装包

arm-none-linux-gnueabi-gcc安装包下载完成后:

首先,拷贝到/usr/local目录下。

<span class="kw2" style="color:#c2cb9;font-weight:bold">sudo</span> <span class="kw2" style="color:#c2cb9;font-weight:bold">cp</span> arm-2009q1-<span class="nu0">203</span>-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 <span class="sy0" style="font-weight:bold">/</span>usr<span class="sy0" style="font-weight:bold">/</span><span class="kw3" style="color:#7a874;font-weight:bold">local</span>

然后,解压到当前目录下。

<span class="kw2" style="color:#c2cb9;font-weight:bold">sudo</span> <span class="kw2" style="color:#c2cb9;font-weight:bold">tar</span> <span class="re5" style="color:#66033;">-jxvf</span> arm-2009q1-<span class="nu0">203</span>-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

执行以上命令后,arm-none-linux-gnueabi-gcc安装包会被解压到当前目录下的一个arm-2009q1目录中。arm-2009q1目录是在解压时自动创建的。

[编辑]增加交叉编译工具路径

解压完成后,可以进入arm-2009q1/目录下查看一下目录结构。其中,在/usr/local/arm-2009q1/bin/目录下存放的是交叉编译工具的各命令。为了使系统能够找到交叉编译工具的各命令,可以将/usr/local/arm-2009q1/bin/目录增加到PATH变量中。以vi为例,步骤如下:

1、打开/etc/bash.bashrc脚本

<span class="kw2" style="color:#c2cb9;font-weight:bold">vi</span> <span class="sy0" style="font-weight:bold">/</span>etc<span class="sy0" style="font-weight:bold">/</span>bash.bashrc


2、增加/usr/local/arm-2009q1/bin/目录到PATH变量中

vi默认进入命令模式,在命令模式下,只能移动光标、修改和删除文字,而且还有固定的操作命令。

在vi下插入文本,必须先进入插入模式。要进入插入模式,可以在命令模式下按<a>或<A>键、【i】或【I】键、<o>或<O>键,操作及其功能如下所示。

操作 功能
a 在光标后开始插入
A 在光标所在行尾开始插入
i 在光标前开始插入
I 在光标所在行的第一个非空格字符前开始插入
o 在光标所在行下新增一行开始插入
O 在光标所在行上新增一行开始插入


首先,将光标移动到文件末行;

其次,按<o>键,在光标所在行下新增一行开始插入;

然后,插入下面的语句;

<span class="kw3" style="color:#7a874;font-weight:bold">export</span> <span class="re2" style="color:#0780;">PATH</span>=<span class="re1" style="color:#0780;">$PATH</span>:<span class="sy0" style="font-weight:bold">/</span>usr<span class="sy0" style="font-weight:bold">/</span>local<span class="sy0" style="font-weight:bold">/</span>arm-2009q1<span class="sy0" style="font-weight:bold">/</span>bin<span class="sy0" style="font-weight:bold">/</span>

最后,保存退出。

在vi下,要保存文件并退出,必须先进入末行模式。要进入末行模式,只有在命令模式下,输入冒号<:>。而当前处于插入模式下,从插入模式返回到命令模式必须按<Esc>键。因此,先按<Esc>键,返回到命令模式;再输入冒号<:>,进入末行模式。如下所示,列出了末行模式下一些常用的命令。

操作 功能
q! 不保存修改,退出vi
wq 保存修改,退出vi


显然,需要保存修改,因此,输入<wq>,保存/etc/bash.bashrc脚本并退出vi,返回到shell命令行。


3、执行/etc/bash.bashrc脚本

尽管增加了交叉编译工具的路径,并且保存了/etc/bash.bashrc脚本,但是,由于修改后,没有执行,因此修改后的PATH变量没有起作用,必须手动执行一次/etc/bash.bashrc脚本,如下所示。

<span class="kw3" style="color:#7a874;font-weight:bold">source</span> <span class="sy0" style="font-weight:bold">/</span>etc<span class="sy0" style="font-weight:bold">/</span>bash.bashrc

当然,也可以重启系统,因为,系统启动时,会自动执行该脚本。

[编辑]验证

接下来,验证arm-none-linux-gnueabi-gcc是否安装成功。可以在shell命令行下,先输入arm-,然后按<Tab>键。如果能够自动补齐为arm-none-linux-gnueabi-,则说明安装成功。

注:64位操作系统需要执行以下命令来安装所需的库文件以运行32位交叉编译工具链:

<span class="kw2" style="color:#c2cb9;font-weight:bold">sudo</span> <span class="kw2" style="color:#c2cb9;font-weight:bold">apt-get</span> <span class="kw2" style="color:#c2cb9;font-weight:bold">install</span> ia32-libs

[编辑]交叉编译工具gcc-arm-linux-gnueabi安装

在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,就称这种编译程序支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。如keil软件,在keil上编译,但在单片机上运行,典型的交叉编译。在编译嵌入式操作系统内核和应用程序之前,必须先安装交叉编译工具。

点击下载

[编辑]打开终端

进入Ubuntu操作系统,依次选择“Applications(应用)”、“Accessories(附件)”、“Terminal(终端)”。shell终端界面如下图所示。


[编辑]安装gcc-arm-linux-gnueabi

在Ubuntu操作系统中,得益于Ubuntu的APT(Advanced Packaging Tool),搜索、安装、升级和卸载软件包,甚至是升级Ubuntu操作系统都非常简单。配合APT工作的是一个功能强大的命令行工具——apt-get命令。apt-get命令一般需要root权限执行,所以一般前面加上sudo。

例如安装一个软件包,只需要在apt-get install后加上软件包全名即可。以下命令用于安装gcc-arm-linux-gnueabi:

<span class="kw2" style="color:#c2cb9;font-weight:bold">sudo</span> <span class="kw2" style="color:#c2cb9;font-weight:bold">apt-get</span> <span class="kw2" style="color:#c2cb9;font-weight:bold">install</span> gcc-arm-linux-gnueabi

在shell命令行下,输入以上命令并按<Enter>键执行,即可下载安装gcc-arm-linux-gnueabi交叉编译工具,如下图所示。

系统不会立即安装,而是先打印安装信息并提示是否继续安装,等待用户选择。如果继续安装,则输入<y>,如下图所示;否则输入<n>。然后按<Enter>键。

如果选择继续安装,接下来,系统才会真正下载安装gcc-arm-linux-gnueabi。安装完成后,系统返回到shell命令行。

[编辑]验证

接下来,验证gcc-arm-linux-gnueabi是否安装成功。可以在shell命令行下,先输入arm-linux,然后按<Tab>键。如果能够自动补齐,则说明安装成功。


2016-03-05 13:48:18 opentld 阅读数 3621


sudo apt-get  install gcc-arm-linux-gnueabi

sudo apt-get install g++-arm-linux-gnueabi

/bin路径:

/usr/bin/ 下,会有arm-linux-gnueabi-gcc 和 arm-linux-gnueabi-g++ 等工具

/lib和/include路径(编译环境路径):

/usr/lib/gcc-cross/arm-linux-gnueabi


在cmake-gui 中设置:

http://www.cnblogs.com/emouse/archive/2013/04/01/2993842.html


tips:

1> 如果编译出来的库或者程序无法运行,出现如下情况:

root@camdroid:/sean_test # ./test1
/system/bin/sh: ./test1: No such file or directory

考虑是否是库链接不成功,

使用 --static 也是一种解决方式:

arm-linux-gnueabi-g++  test.cpp  -o test1 --static

2> gcc -lstdc++  =  g++

3> 交叉编译工具选择:linaro  非盈利组织发布, 开源

查看elf文件类型 file



2018-11-07 15:08:20 weixin_42575806 阅读数 1246

采用arm-none-linux-gnueabi-gcc编译的时候会出现标准库无法找到的情况。例如:

[root@localhost wpcode]# arm-none-linux-gnueabi-gcc *.c -fPIC -shared -o libsdk.so 
opensslRsa.c:3:30: error: openssl/ossl_typ.h: No such file or directory
opensslRsa.c:4:25: error: openssl/pem.h: No such file or directory
opensslRsa.c:5:26: error: openssl/x509.h: No such file or directory
opensslRsa.c:6:25: error: openssl/rsa.h: No such file or directory
opensslRsa.c:8:26: error: openssl/des.h: No such file or directory

 

解决办法:

[root@localhost wpcode]# echo 'main(){}'|arm-linux-gcc -E -v - 
bash: arm-linux-gcc: 未找到命令...
[root@localhost wpcode]# echo 'main(){}'|arm-none-linux-gnueabi-gcc -E -V -
arm-none-linux-gnueabi-gcc: '-V' must come at the start of the command line
[root@localhost wpcode]# echo 'main(){}'|arm-none-linux-gnueabi-gcc -E -v -
Using built-in specs.
Target: arm-none-linux-gnueabi
Configured with: /scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/src/gcc-4.3/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --with-specs='%{funwind-tables|fno-unwind-tables|mabi=*|ffreestanding|nostdlib:;:-funwind-tables}' --enable-languages=c,c++ --enable-shared --enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion='Sourcery G++ Lite 2009q1-203' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --with-build-sysroot=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/install/arm-none-linux-gnueabi/libc --with-gmp=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/obj/host-libs-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/obj/host-libs-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/install/arm-none-linux-gnueabi/bin --with-build-time-tools=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/install/arm-none-linux-gnueabi/bin
Thread model: posix
gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203) 
COLLECT_GCC_OPTIONS='-E' '-v' '-funwind-tables'
 /usr/local/arm-2009q1/bin/../libexec/gcc/arm-none-linux-gnueabi/4.3.3/cc1 -E -quiet -v -iprefix /usr/local/arm-2009q1/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/ -isysroot /usr/local/arm-2009q1/bin/../arm-none-linux-gnueabi/libc - -funwind-tables
ignoring nonexistent directory "/usr/local/arm-2009q1/bin/../arm-none-linux-gnueabi/libc/usr/local/include"
ignoring duplicate directory "/usr/local/arm-2009q1/bin/../lib/gcc/../../lib/gcc/arm-none-linux-gnueabi/4.3.3/include"
ignoring duplicate directory "/usr/local/arm-2009q1/bin/../lib/gcc/../../lib/gcc/arm-none-linux-gnueabi/4.3.3/include-fixed"
ignoring duplicate directory "/usr/local/arm-2009q1/bin/../lib/gcc/../../lib/gcc/arm-none-linux-gnueabi/4.3.3/../../../../arm-none-linux-gnueabi/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/arm-2009q1/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/include
 /usr/local/arm-2009q1/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/include-fixed
 /usr/local/arm-2009q1/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/../../../../arm-none-linux-gnueabi/include
 /usr/local/arm-2009q1/bin/../arm-none-linux-gnueabi/libc/usr/include
End of search list.
# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "<stdin>"
main(){}
COMPILER_PATH=/usr/local/arm-2009q1/bin/../libexec/gcc/arm-none-linux-gnueabi/4.3.3/:/usr/local/arm-2009q1/bin/../libexec/gcc/:/usr/local/arm-2009q1/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/../../../../arm-none-linux-gnueabi/bin/
LIBRARY_PATH=/usr/local/arm-2009q1/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/:/usr/local/arm-2009q1/bin/../lib/gcc/:/usr/local/arm-2009q1/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/../../../../arm-none-linux-gnueabi/lib/:/usr/local/arm-2009q1/bin/../arm-none-linux-gnueabi/libc/lib/:/usr/local/arm-2009q1/bin/../arm-none-linux-gnueabi/libc/usr/lib/
COLLECT_GCC_OPTIONS='-E' '-v' '-funwind-tables'

我们可以找到他的标准库的编译路径是:

#include <...> search starts here:
 /usr/local/arm-2009q1/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/include
 /usr/local/arm-2009q1/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/include-fixed
 /usr/local/arm-2009q1/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/../../../../arm-none-linux-gnueabi/include
 /usr/local/arm-2009q1/bin/../arm-none-linux-gnueabi/libc/usr/include

第二步:将我们的自带的标准库的路径找到标准库地址

[root@localhost wpcode]# find / -name pem.h
/usr/local/src/mysql-5.6.35/extra/yassl/include/openssl/pem.h
/usr/local/src/openssl-1.1.0e/include/openssl/pem.h
/usr/local/openssl/include/openssl/pem.h
[root@localhost wpcode]# 

第三步:建立连接地址

[root@localhost wpcode]# ln -s /usr/local/openssl/include/openssl /usr/local/arm-2009q1/bin/../arm-none-linux-gnueabi/libc/usr/include/openssl

好了,再次编译,生成ARM的动态库文件

[root@localhost wpcode]# arm-none-linux-gnueabi-gcc *.c -fPIC -shared -o libsdk.so 
sdklib.c: In function 'qrcode_verify':
sdklib.c:484: warning: passing argument 4 of 'get_grcode_all_elements' from incompatible pointer type
sdklib.c:484: warning: passing argument 5 of 'get_grcode_all_elements' from incompatible pointer type
sdklib.c:546: warning: passing argument 2 of 'read_data_file' from incompatible pointer type
sdklib.c:549: warning: passing argument 1 of 'getMac' from incompatible pointer type
sdklib.c:549: warning: passing argument 2 of 'getMac' from incompatible pointer type
sdklib.c:549: warning: passing argument 3 of 'getMac' from incompatible pointer type
sdklib.c:673: warning: passing argument 1 of 'getMac' from incompatible pointer type
sdklib.c:673: warning: passing argument 2 of 'getMac' from incompatible pointer type
sdklib.c:673: warning: passing argument 3 of 'getMac' from incompatible pointer type
WriteLog.c: In function 'WRITE_LOG':
WriteLog.c:88: warning: passing argument 2 of 'WriteLogFile' discards qualifiers from pointer target type
WriteLog.c: In function 'GetTime':
WriteLog.c:238: warning: incompatible implicit declaration of built-in function 'strncpy'
WriteLog.c: In function 'get_save_file_name':
WriteLog.c:264: warning: incompatible implicit declaration of built-in function 'strncpy'
WriteLog.c: In function 'GetCompletePath':
WriteLog.c:310: warning: incompatible implicit declaration of built-in function 'strcat'
WriteLog.c:311: warning: incompatible implicit declaration of built-in function 'strncpy'
WriteLog.c:311: warning: incompatible implicit declaration of built-in function 'strlen'
WriteLog.c: In function 'GetConfigValue':
WriteLog.c:338: warning: passing argument 1 of 'get_save_file_name' from incompatible pointer type
WriteLog.c: In function 'GetStringContentValue':
WriteLog.c:379: warning: incompatible implicit declaration of built-in function 'strcpy'
WriteLog.c:383: warning: incompatible implicit declaration of built-in function 'memset'
WriteLog.c:393: warning: incompatible implicit declaration of built-in function 'strlen'
WriteLog.c:407: warning: incompatible implicit declaration of built-in function 'memcpy'
WriteLog.c:449: warning: incompatible implicit declaration of built-in function 'strncpy'
WriteLog.c: In function 'GetConfigFileStringValue':
WriteLog.c:492: warning: incompatible implicit declaration of built-in function 'strcpy'
WriteLog.c:496: warning: incompatible implicit declaration of built-in function 'strcpy'
[root@localhost wpcode]# ls
Config.ini  mackey      Makefile      opensslRsa.h  publickey      sdk.h     sdklib.o      test    test.o                   WriteLog.c  WriteLog.o
libsdk.so   mackey.txt  opensslRsa.c  opensslRsa.o  publickey.pem  sdklib.c  signdata.txt  test.c  WriteLog-2018-11-07.log  WriteLog.h
[root@localhost wpcode]# 
[root@localhost wpcode]# file libsdk.so 
libsdk.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped
[root@localhost wpcode]# 

 

2017-04-16 11:28:11 ajianyingxiaoqinghan 阅读数 9597

Ubuntu 14.04 LTS下使用arm-linux-gcc交叉编译OpenCV 2.4.9

当前两个手头有两个项目都是都需要在ARM板中使用OpenCV,所以交叉编译必不可少。两三天里一直查阅各种资料,最后终于把交叉编译走通了……
参考地址:
http://blog.csdn.net/zdyueguanyun/article/details/51322295
http://blog.csdn.net/luotuo44/article/details/8958990
十分感谢上述参考地址的教学,有很重大的指导意义。但中间确实也存在着类似于命令行缺少空格之类的错误,所以笔者准备把自己的交叉编译过程详细写下来,尽量让读者们少走弯路~

笔者操作环境:

  • PC操作系统:Ubuntu 14.04 LTS
  • OpenCV 2.4.9
  • 编译器:arm-linux-gcc 4.3.2
  • CMake版本:2.8.12

注:
1、本文所有操作都需要以root权限进行操作。
2、笔者使用的所有压缩包下载地址都已分享,且笔者也将其全部打包分享在百度云,百度云下载地址如下。
链接: https://pan.baidu.com/s/1D40Jq0u1uAbL0mpuPV9_hQ 密码: idju

一、安装依赖项

首先,我们需要安装几项与视频解码相关的依赖项。如果没有安装这些依赖项,在对OpenCV的make时,会出现如下结果:

FFMPEG: NO
– codec: NO
– format: NO
– util: NO
– swscale: NO
– gentoo-style: NO

首先本文的操作全部在root权限下进行,所以第一步先获得root权限:

sudo su

安装依赖项的指令如下:

apt-get install libavcodec-dev libavformat-dev libswscale-dev

二、ARM编译器的安装:

笔者的arm-linux-gcc 4.3.2下载地址如下:
http://download.csdn.net/detail/xinhuameng/2642452
直接将arm-linux-gcc-4.3.2.tgz解压在根目录/下:

tar -zxvf arm-linux-gcc-4.3.2.tgz -C /

进入/root/.bashrc,使用vim或gedit对其进行操作:

gedit /root/.bashrc

/root/.bashrc最下方添加环境变量:

export PATH=$PATH:/usr/local/arm/4.3.2/bin
export OPENCV_DEPEND=/usr/local/arm/opencv-depend
export OPENCV_INSTALL=/usr/local/arm/opencv-install

如图所示:
这里写图片描述

其中,/usr/local/arm/4.3.2/bin是arm编译器的路径;
/usr/local/arm/opencv-depend是OpenCV依赖库安装路径;
/usr/local/arm/opencv-install是OpenCV安装路径。

此时输入指令或重启电脑,使新的环境变量生效。输入指令如下:

source /root/.bashrc

检验环境变量生效的方法是:在root权限下,终端中输入arm,然后按Tab键,出现图示如下:
这里写图片描述
只要终端显示出arm-linux-gcc-4.3.2, arm-none-linux-gnueabi-g++, arm-none-linux-gnueabi-gcc, arm-none-linux-gnueabi-gcc-4.3.2,就说明arm编译器已经配置成功了。

三、安装依赖库

OpenCV交叉编译之前,首先需要对依赖库进行交叉编译。因为OpenCV依赖于很多库函数,如果在编译OpenCV之前没有编译依赖项,就会导致编译后的OpenCV无法使用。
OpenCV交叉编译时各个库的依赖关系如下所示:

  • OpenCV
    • zlib
    • jpeg
    • libpng
      • zlib
    • tiff
      • zlib
    • ffmpeg
      • x264
      • xvidcore

笔者使用的依赖库如下所示:

  • zlib-1.2.11
  • jpegsrc.v9b
  • libpng-1.6.29
  • yasm-1.3.0
  • x264-snapshot-20170415-2245
  • xvidcore_1.3.3.orig
  • ffmpeg-2.8.11

笔者已经将上述依赖库放置在笔者的云盘中,且下载地址已经在上文分享。另外下载上述依赖库源码的网址如下:

**注:后面所有的交叉编译操作,都需要进入依赖库解压的地址进行操作。
如笔者将上述所有源码解压到了路径/home/grq/src/下,且该路径下有如下源码包:

zlib-1.2.11
jpeg-9b
libpng-1.6.29
yasm-1.3.0
x264-snapshot-20170415-2245
xvidcore-1.3.3
ffmpeg-2.8.11

zlib为例,此时如果笔者想对zlib进行交叉编译,则需要进入到zlib的路径:

cd /home/grq/src/zlib-1.2.11

随后进行相应的操作。

其余依赖库的交叉编译都需要进行这一步骤,后续不再赘述。

1、zlib的交叉编译:

./configure --prefix=$OPENCV_DEPEND

之后,对Makefile文件进行修改,修改内容如下:

CC=arm-linux-gcc
AR=arm-linux-ar
RANLIB=arm-linux-ranlib
LDSHARED=arm-linux-gcc -shared -Wl,-soname,libz.so.1,–version-script,zlib.map

修改之后,如图所示:
这里写图片描述
之后执行命令:

make
make install

2、libjpeg的交叉编译:

./configure --host=arm-linux --prefix=$OPENCV_DEPEND --enable-shared --enable-static
make
make install

3、libpng的交叉编译:

./configure --host=arm-linux --prefix=$OPENCV_DEPEND --enable-shared --enable-static
make
make install

4、yasm的交叉编译:

CC=arm-linux-gcc ./configure --enable-shared --host=arm-linux --disable-asm --prefix=$OPENCV_DEPEND
make
make install

5、libx264的交叉编译:

CC=arm-linux-gcc ./configure --enable-shared --host=arm-linux --disable-asm --prefix=$OPENCV_DEPEND
make
make install

6、libxvid的交叉编译:

进入libxvid的目录后,再行进入其子目录中:

cd ./build/generic

然后输入命令:

./configure --prefix=$OPENCV_DEPEND --host=arm-linux --disable-assembly
make
make install

7、ffmpeg的交叉编译:

./configure --prefix=$OPENCV_DEPEND --enable-shared --disable-static --enable-gpl --enable-cross-compile --arch=arm --disable-stripping --target-os=linux --enable-libx264 --enable-libxvid --cc=arm-linux-gcc --enable-swscale --extra-ldflags=-L$OPENCV_DEPEND/lib --extra-cflags=-I$OPENCV_DEPEND/include

注:按照该流程安装时,下载ffmpeg 2.8版本,不要下载最新的ffmpeg 3.3版本!否则可能会像笔者编译OpenCV至21%时,显示make错误;

至此,依赖库编译安装完成。

8、OpenCV依赖库复制到ARM编译器路径下

此时,需要将路径/usr/local/arm/opencv-depend下的lib和include中所有文件分别拷贝到路径/usr/local/arm/4.3.2/arm-non-linux-gnueabi/下的lib和include下。命令如下:

cp -r /usr/local/arm/opencv-depend/include/ /usr/local/arm/4.3.2/arm-none-linux-gnueabi/
cp -r /usr/local/arm/opencv-depend/lib/ /usr/local/arm/4.3.2/arm-none-linux-gnueabi/

如果没有进行该步骤,在后面对OpenCV进行make操作时,会出现如下错误:
这里写图片描述

四、OpenCV的交叉编译

1、获取OpenCV源码

笔者这里使用的是OpenCV 2.4.9版本,可以在官网上下载。
官网下载地址:http://opencv.org/releases.html

2、设置工具链toolchain.cmake

下载并解压OpenCV后,进入OpenCV 2.4.9的路径,并新建文件夹build:

cd opencv-2.4.9
mkdir build
cd ./build

在build文件夹中,用vim或gedit新建文件toolchain.cmake

gedit toolchain.cmake

toolchain.cmake文件中填入如下内容:

###########user defined#############
set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR arm )
set( CMAKE_C_COMPILER arm-none-linux-gnueabi-gcc )
set( CMAKE_CXX_COMPILER arm-none-linux-gnueabi-g++ )
###########user defined#############
set( CMAKE_FIND_ROOT_PATH "/usr/local/arm/opencv-depend" )
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
######################################

保存文件后,执行如下命令:

cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ../

3、对OpenCV进行cmake配置

后面就会需要对OpenCV进行cmake操作,如果PC机没有安装cmake,则需要输入指令:

apt-get install cmake cmake-qt-gui

依旧在build路径下,打开cmake的界面程序,即输入指令:

cmake-gui

设置源代码地址为/opencv-2.4.9,构建地址为/opencv-2.4.9/build,并对如下选项进行修改:

  • CMAKE_INSTALL_PREFIX(安装目录),默认为/opencv-2.4.9/build/install,改为/usr/local/arm/opencv-install
  • 去掉 WITH_CUDA
  • 去掉 WITH_GTK
  • 去掉 WITH_1394
  • 去掉 WITH_GSTREAMER
  • 去掉 WITH_LIBV4L
  • 去掉 WITH_TIFF
  • 去掉 BUILD_OPENEXR
  • 去掉 WITH_OPENEXR
  • 去掉 BUILD_opencv_ocl
  • 去掉 WITH_OPENCL

OpenCV修改项众多,可以利用cmake-gui的搜索功能简化操作。修改界面如图所示:
这里写图片描述
将上述操作进行完毕后,先按下Configure,然后按下Generate。

此时修改在/opencv-2.4.9/build文件夹中的CMakeCache.txt
CMAKE_EXE_LINKER_FLAGS选项本来为空,此时在后面加上:-lpthread -lrt
效果如图所示:
这里写图片描述

4、编译OpenCV

/opencv-2.4.9/build路径下执行命令:

make
make install

等待较长时间后,OpenCV的交叉编译就完成了。

五、交叉编译后的OpenCV移植到ARM上

1、配置pkg-config

参考地址:http://blog.csdn.net/luotuo44/article/details/24836901
大家应该都知道用第三方库,就少不了要使用到第三方的头文件和库文件。我们在编译、链接的时候,必须要指定这些头文件和库文件的位置。
对于一个比较大第三方库,其头文件和库文件的数量是比较多的。如果我们一个个手动地写,那将是相当麻烦的。所以,pkg-config就应运而生了。pkg-config能够把这些头文件和库文件的位置指出来,给编译器使用。
平常都是这样用pkg-config的:

gcc main.c `pkg-config --cflags --libs gtk+-2.0` -o main

上面的编译命令中,`pkg-config --cflags --libs gtk±2.0`的作用就如前面所说的,把gtk的头文件路径和库文件列出来,让编译去获取。–cflags和–libs分别指定头文件和库文件。
PS:命令中的`不是引号,而是数字1左边那个键位的那个符号。

在前面的OpenCV配置过程中,pkg-config便已经生成。生成地址为/usr/local/arm/opencv-install/lib/pkgconfig/opencv.pc

2、配置shell

用vim或gedit编辑文件/etc/bash.bashrc

gedit /etc/bash.bashrc

在最后一行加入:

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/arm/opencv-install/lib/pkgconfig
export PKG_CONFIG_PATH

效果如图所示:
这里写图片描述
然后输入指令:

source /etc/bash.bashrc

这样就更新了这一条配置信息,不需要再重新启动了。

3、测试使用

创建并编辑一个test.cpp文件:

#include <cv.h>
#include <highgui.h>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    IplImage* image = cvLoadImage("/root/Desktop/miska.jpg");
    if(image == NULL)
    {
        cout<<"loud image fail"<<endl;
	return -1;
    }

    cvNamedWindow("src", 1);
    cvShowImage("src", image);
    cvWaitKey();
    
    cvDestroyWindow("src");
    cvReleaseImage(&image);
 
    return 0;
}

保存退出后,输入如下编译指令:

arm-linux-g++ `pkg-config --cflags --libs opencv` test.cpp -lpthread -lrt -o test

再注:命令中的`不是引号,而是数字1左边那个键位的那个符号。

以后编译arm板的OpenCV代码时,要使用上面的编译指令。其中` 符号不是逗号,而是1 左边的那个符号。而把编译好的程序放到arm板时,在运行时,还要把/usr/local/arm/opencv-install/lib目录下的所有.so文件都拷贝到arm的/usr/lib或者/lib目录下。

2012-04-13 21:58:04 leeagle 阅读数 5488

当用mips64el-unknown-linux-gnu-gcc编译一个t.c的文件时,

t.c的内容如下:

#include<stdio.h>

int main()

{

       return 0;

}


mybox ~ # mips64el-unknown-linux-gnu-gcc -c t.c
mybox ~ # mips64el-unknown-linux-gnu-ld -o -m elf64ltsmip t t.o
mips64el-unknown-linux-gnu-ld: cannot find elf64ltsmip: No such file or directory
t.o: In function `main':
t.c:(.text+0x0): multiple definition of `main'
t:(.text+0x0): first defined here

可以用下面的方法解决这个问题:

mips64el-unknown-linux-gnu-gcc -mabi=64 -c t.c
mips64el-unknown-linux-gnu-ld -m elf64ltsmip -o t t.o

用下面的这个命令可以看该机器都支持哪几种emulations:
mybox ~ # mips64el-unknown-linux-gnu-ld -o -mabi=64 t t.o
mips64el-unknown-linux-gnu-ld: unrecognised emulation mode: abi=64
Supported emulations: elf32ltsmipn32 elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip

4.gcc和arm-linux-gcc

阅读数 2458