如何在ubuntu mate上安装gcc-arm-arm linux gcc 安装-gnueabihf

1848人阅读
opencv(12)
Linux(11)
tools(5)
这两天因为要在arm板子上跑基于opencv的程序,故对opencv2.4.10在ubuntu环境下用arm-linux-gnueabihf进行了编译。中间遇到了很多问题,现在把整个经过记录下来,以供大家参考。
opencv版本: opencv2.4.10
交叉编译器:&arm-linux-gnueabihf
环境变量配置: 在当前用户命令下,配置cmake和arm-linux-gnueabihf的环境变量。&
用vi .bashrc打开用户环境变量脚本,在最后行输入:
export PATH=$PATH:/home/username/linaro-multilib-2014.06-gcc4.9/bin
export PATH=/home/username/cmake-2.8.4-Linux-i386/bin:$PATH
编译opencv包括四个部分:
1. 编译jpeg库
& &&cd /home/.../jpeg-8d & & 这里用的是jpeg-8d版本,从官网上下载压缩包,直接解压缩在home路径下,并且进入当前目录。
& &./configure CC=arm-linux-gnueabihf-gcc --host=arm-linux-gnueabihf --prefix=/home/wangxiaoming/libopencv_arm/libjpeg-8d --enable-shared --enable-static
& & jpeg库目录下有configure文件,故可以直接用上面的命令进行编译。
& & 说明: &CC=arm-linux-gnueabihf-gcc, 指的是所用的编译器类型,gcc指的是用来编译.C文件;&--host=arm-linux-gnueabihf 指的是所用的编译器名称。--prefix指的是编译&
& & 出来 的文件存放的目录。--enable-shared --enable-static, 分别指的是动态编译和静态编译。
& & 最后执行make, make install命令。&
2. 编译zlib 库
& & 在home下解压缩库文件,参照下图修改Makefile文件。注意,在Makefile里要添加上添加编译选项:
& & CFLAGS+=-fPIC。否则,后期编译opencv时会出现错误:
Linking CXX shared library../../lib/libopencv_core.so
/home/wangxiaoming/linaro-multilib-2014.06-gcc4.9/bin/../lib/gcc/arm-linux-gnueabihf/4.9.1/../../../../arm-linux-gnueabihf/bin/ld:../../3rdparty/lib/libzlib.a(gzlib.c.obj):
../../3rdparty/lib/libzlib.a: error addingsymbols: Bad value
collect2: error: ld returned 1 exit status
make[2]: *** [lib/libopencv_core.so] Error1
make[1]: ***[modules/core/CMakeFiles/opencv_core.dir/all] Error 2
make: *** [all] Error 2
3. 编译opencv2.4.10时,先用cmake-gui版本进行编译。
& & 执行./cmake-gui命令:@ubuntu:~/cmake-2.8.4-Linux-i386/bin$ ./cmake-gui &会出现cmake的图形界面。
& & &点击configure, 选择Specify options for cross-compiling选项。接下来继续配置如下,记得用“Linux”,其它的如下配置:
& & & & &再下来,选择编译选项,注意去掉 WITH_TBB,WITH_GTK等选项(具体可查看其它),ARM不支持。
& & & & &另外注意更改编译安装路径:CMAKE_INSTALL_PREFIX 的路径 /usr/local &为 &/home/.../libopencv 自定义的路径下。
& & & & &然后configure, &再Generate. &
& & & & 4. 安装opencv2.4.10
& & & & &在交叉编译的路径下,即在libopencv目录下,执行make命令 (cmake编译生成的makefile文件在这里)。
& 在此时,先把编译好的第三方库zlib和jpeg的头文件和库文件复制到 opencv安装的路径下的include和lib文件下,再 执行make命令,成功编译后。在执行make install命令, & & 中间遇到了错误:
& CMake Error at modules/core/cmake_install.cmake:48 (FILE):
& file INSTALL cannot find
& &/home/../libopencv_arm/libopencv/lib/libopencv_core.so.2.4.10&.
& Call Stack (most recent call first):
& modules/cmake_install.cmake:62 (INCLUDE)
& cmake_install.cmake:75 (INCLUDE)
& 解决这个问题,需要在libopencv文件夹下的cmake_install.cmake文件里修改CMAKE_INSTALL_PREFIX,在之前的安装路径/home/username/libopencv_arm/libopencv/修 & & 改为/home/username/libopencv_arm/libopencv/temp.&
& 然后在/home/username/libopencv_arm/libopencv路径下执行make install命令,在temp文件夹下生成include, lib和share文件。
& 可以把../libopencv/include和../libopencv/lib和../libopencv/temp/include和../libopencv/temp/lib文件合在一起。
& 到此,opencv2.4.10的交叉编译完成了。
& &环境配置:命令vim .bashrc,在文件最后一行输入:
& &PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/wng/libopencv_arm/libopencv/lib/pkgconfig
exportPKG_CONFIG_PATH
& 5. 编译测试
& &假如已经有一个hello.cpp函数文件了,进入其所在目录,执行下列命令进行编译:
& &arm-linux-gnueabihf-g++ hello.cpp -o hello &-lpthread -lrt `pkg-config --libs --cflags opencv`
& &其中arm-linux-gnueabihf-g++是编译用的编译器,hello.cpp是要编译的程序;hello为编译后生成的可执行二进制程序,可以任意命名。 &
& &到此,opencv交叉编译已全部完成。
& &知识在于分享与交流。若有问题,欢迎大家留言!
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:51078次
排名:千里之外
原创:11篇
转载:60篇
评论:19条
(1)(2)(1)(3)(1)(3)(1)(2)(1)(6)(10)(2)(7)(4)(10)(6)(8)(4)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'ubuntu下安装arm-linux-gcc详解以及在linux下的简单应用演示
最近在学习ARM9(AT91SAM9260),顺便做点笔记吧!
1.首先下载arm-linux-gcc安装包,下载后复制到ubuntu下的某个目录下,然后在ubuntu下打开一个终端,然后进入该目录下
2.输入命令 sudo tar xvzf arm-linux-gcc-4.4.3.tar.gz -C/
&进行安装(注意:命令最后的字母C要大写),如下图所示
3.安装过程如下图:
4.继续输入以下命令进行环境变量设置: sudo gedit /etc/environment 如下图所示:
5.在PATH最后加上 :/opt/FriendlyARM/toolschain/4.4.3/bin 如下图:
6.保存后重启ubuntu
7.检查是否导入 PATH : echo $PATH ,正常导入后继续输入命令 arm-linux-gcc -v
会出现安装信息,表明一切安装完成,如下图所示:
8.下面使用 vi 编辑一个 源文件 helloworld.c 文件,如下:
9.保存后分别使用 gcc 和 arm-linux-gcc 编译该源文件,编译后如下:
10。在ubuntu下直接运行&
&./helloworld-linux& 如下:
11.把 helloworld 文件放在 目标 arm 板上,这里我通过在ubuntu下把该目标文件拷贝到 U盘下,然后将
U盘挂载到 arm 板下 然后运行该 目标文件 运行方式与在ubuntu下一样的,输入&
./helloworld& 即可 如下:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。如何在ubuntu mate上安装gcc-arm-linux-gnueabihf? - 知乎2被浏览446分享邀请回答m.blog.csdn.net/article/details?id=加入环境变量0添加评论分享收藏感谢收起> 博客详情
Ubuntu11.04中搭建交叉编译环境(arm-linux-gcc-4.6.1版本)
&声明:本文主要参考,并根据实际情况作了一定的修改与说明
编译环境:
内核名称:Linux
内核发行版:2.6.38-11-generic
内核版本:#50-Ubuntu SMP Mon Sep 12 21:18:14 UTC 2011
硬件架构名称:i686
硬件平台:i386
操作系统:GNU/Linux
当前系统gcc版本号:4.5.2
在Linux中建立整个ARM交叉编译环境的整体过程为:&
1、& 下载源码包
2、& 建立编译目录并设置环境变量
3、& 安装内核头文件
4、& 安装二进制工具(binutils)
5、& 建立初始编译器工具链(简版gcc)
6、& 建立glibc库
7、& 建立全套编译器工具链(full gcc)
一、下载源码包
GNU的所有源码文件都可以到这个地址下载:http://ftp.gnu.org/gnu/
Linux Kernel源代码可以去这里下载:http://www.kernel.org
mpc可以去这里下载:http://www.multiprecision.org
下载的源码包如下:
binutils-2.21.1.tar.bz2
gcc-4.6.1.tar.gz
glibc-2.14.tar.gz
glibc-linuxthreads-2.5.tar.bz2
glibc-ports-2.13.tar.gz&
gmp-5.0.2.tar.bz2
linux-2.6.32.45.tar.gz
mpc-0.9.tar.gz
mpfr-2.4.2.tar.gz
注:mpfr不建议使用3.0.0版本。mpfr-3.0.0有Bug,会导致gcc编译不过。
二、建立编译目录并设置环境变量
选定自己的工作目录,如我选择/opt/embedded作为自己的工作目录。然后再embedded中建立build-tools、kernel、tools三个文件夹。实例:
root@ubuntu:/opt/ming# cd /opt/
root@ubuntu:/opt# mkdir embedded
root@ubuntu:/opt# cd embedded/
root@ubuntu:/opt/embedded# mkdir build-tools kernel tools
root@ubuntu:/opt/embedded# cd build-tools/
root@ubuntu:/opt/embedded/build-tools# mkdir build-binutils build-boot-gcc build-glibc build-gcc&
各文件夹的作用如下:
/opt/embedded:交叉编译环境的主目录
/opt/embedded/build-tools:存放binutils、gcc、glibc等GNU源码和用来编译这些源代码的目录
/opt/embedded/kernel:用来存放Linux内核源代码&
/opt/embedded/tools:用来存放编译好的交叉编译工具和库文件
/opt/embedded/build-tools/build-binutils:编译binutils的目录
/opt/embedded/build-tools/build-boot-gcc:编译gcc启动部分的目录
/opt/embedded/build-tools/build-glibc:编译glibc的目录
/opt/embedded/build-tools/build-gcc:编译整个gcc的目录
建立好编译目录之后便是设置环境变量(建议直接在~/.bashrc中修改,注意修改之后要重新运行Terminal)。如下:
export PRJROOT=/opt/embedded&
export TARGET=arm-linux
export PREFIX=$PRJROOT/tools&
export TARGET_PREFIX=$PREFIX/$TARGET
export PATH=$PREFIX/bin:$PATH
各个环境变量的意义如下:
PRJROOT:整个交叉编译环境的根目录
TARGET:目标文件对应的architecture,arm-linux表示编译出来的target只能在arm architecture中运行
PREFIX:目标文件夹的路径前缀
TARGET_PREFIX:目标文件夹的路径前缀路径
PATH:可执行文件路径,这里主要指定编译工具等
三、安装内核头文件
将Linux内核源码解压至$PRJROOT/kernel目录,然后建立几个文件的符号链接,最后生成version.h文件。实例:
首先解压Linux内核源文件
root@ubuntu:/opt/embedded/kernel# cp /mnt/hgfs/VMwareShare_Ubuntux64/linux-2.6.32.45.tar.gz .
root@ubuntu:/opt/embedded/kernel# tar -xvf linux-2.6.32.45.tar.gz
root@ubuntu:/opt/embedded/kernel# mkdir /opt/embedded/tools/arm-linux
root@ubuntu:/opt/embedded/kernel# mkdir /opt/embedded/tools/arm-linux/include
root@ubuntu:/opt/embedded/kernel# ln -s /opt/embedded/kernel/linux-2.6.32.45/include/linux /opt/embedded/tools/arm-linux/include/linux
root@ubuntu:/opt/embedded/kernel# ln -s /opt/embedded/kernel/linux-2.6.32.45/include/asm-generic /opt/embedded/tools/arm-linux/include/asm-generic
root@ubuntu:/opt/embedded/kernel# ln -s /opt/embedded/kernel/linux-2.6.32.45/arch/arm/include/asm /opt/embedded/tools/arm-linux/include/asm (也可能是是asm-arm,示内核版本而定)
下面检查上面创建的符号链接是否正确。实例:
root@ubuntu:/opt/embedded/kernel# cd /opt/embedded/tools/arm-linux/include/
root@ubuntu:/opt/embedded/tools/arm-linux/include# ll
asm -& /opt/embedded/kernel/linux-2.6.32.45/arch/arm/include/asm/
asm-generic -& /opt/embedded/kernel/linux-2.6.32.45/include/asm-generic/
linux -& /opt/embedded/kernel/linux-2.6.32.45/include/linux/
有如上结果表示符号链接创建正确。
最后生成version.h文件。实例:
root@ubuntu:/opt/embedded/kernel/linux-2.6.32.45# cd /opt/embedded/kernel/linux-2.6.32.45/
root@ubuntu:/opt/embedded/kernel/linux-2.6.32.45# make include/linux/version.h
& CHK&&&& include/linux/version.h
& UPD&&&& include/linux/version.h
接着进入相应目录查看version.h文件是否建立成功。
&注:上述的做法理论上没什么问题,但实际操作时,如果用其他版本的linux内核可能会出现头文件包含不全的情况,这会直接导致后面编译glibc时出现未定义、未声明、缺少头文件(如asm/unistd.h)的错误。如果可能的话,建议按上述操作直接copy好用的其他交叉编译工具链中的asm-arm、asm-generic、linux目录。
四、安装二进制工具(binutils)
Binutils是一些二进制工具集合,其中包含了常用的一些命令。首先将binutils-2.21.1.tar.bz2解压至build-tools,然后进入build-binutils目录,配置并编译binutils,最后使用make install进行安装。实例:
root@ubuntu:/opt/embedded/build-tools# cd /opt/embedded/build-tools/
root@ubuntu:/opt/embedded/build-tools# cp /mnt/hgfs/VMwareShare_Ubuntux64/binutils-2.21.1.tar.bz2 .
root@ubuntu:/opt/embedded/build-tools# tar -xjf binutils-2.21.1.tar.bz2
root@ubuntu:/opt/embedded/build-tools# cd build-binutils/
root@ubuntu:/opt/embedded/build-tools/build-binutils# ../binutils-2.21.1/configure --target=$TARGET --prefix=$PREFIX
root@ubuntu:/opt/embedded/build-tools/build-binutils# make
root@ubuntu:/opt/embedded/build-tools/build-binutils# make install
完成后,去$PREFIX中检查一下生成的工具。实例:
root@ubuntu:/opt/embedded/build-tools/build-binutils# cd /opt/embedded/tools/bin
root@ubuntu:/opt/embedded/tools/bin# ll
有如下文件:
arm-linux-addr2line*
arm-linux-ar*
arm-linux-as*
arm-linux-c++filt*
arm-linux-elfedit*
arm-linux-gprof*
&arm-linux-ld*
arm-linux-ld.bfd*
arm-linux-nm*
arm-linux-objcopy*
arm-linux-objdump*
arm-linux-ranlib*
arm-linux-readelf*
arm-linux-size*
arm-linux-strings*
arm-linux-strip*
这些生成的文件的作用分别为:
arm-linux-addr2line:将你要找的地址转成文件和行号,它要使用 debug 信息
arm-linux-ar:产生、修改和解开一个存档文件
arm-linux-as:GNU的汇编器
arm-linux-c++filt:C++ 和 java 中有一种重载函数,所用的重载函数最后会被编译转化成汇编的标,c++filt 就是实现这种反向的转化,根据标号得到函数名
arm-linux-elfedit:用途暂时未知
arm-linux-gprof:GNU汇编器预编译器
arm-linux-ld:GNU的连接器
arm-linux-ld.bfd:用途暂时未知
arm-linux-nm:列出目标文件的符号和对应的地址
arm-linux-objcopy:将某种格式的目标文件转化成另外格式的目标文件
arm-linux-objdump:显示目标文件的信息
arm-linux-ranlib:为一个存档文件产生一个索引,并将这个索引存入存档文件中
arm-linux-readelf:显示 elf 格式的目标文件的信息
arm-linux-size:显示目标文件各个节的大小和目标文件的大小
arm-linux-strings:打印出目标文件中可以打印的字符串,有个默认的长度,为4
arm-linux-strip:剥掉目标文件的所有的符号信息
注:编译过程中有可能出现的错误:
gcc -DHAVE_CONFIG_H -I.& -I. -I. -I../bfd -I./config -I./../include -I./.. -I./../bfd -DLOCALEDIR="\"/tools/cross/share/locale\""& -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -g -O2 -MT tc-arm.o -MD -MP -MF .deps/tc-arm.Tpo -c -o tc-arm.o `test -f 'config/tc-arm.c' || echo './'`config/tc-arm.c
cc1: warnings being treated as errors
config/tc-arm.c: In function ‘make_mapping_symbol’:
config/tc-arm.c:2489: 警告:if 语句体为空
make[4]: *** [tc-arm.o] 错误 1& // 排错要充分利用报错信息。
make[4]: Leaving directory `/root/build/binutils-2.20_cross/gas'
make[3]: *** [all-recursive] 错误 1
make[3]: Leaving directory `/root/build/binutils-2.20_cross/gas'
make[2]: *** [all] 错误 2
make[2]: Leaving directory `/root/build/binutils-2.20_cross/gas'
make[1]: *** [all-gas] 错误 2
make[1]: Leaving directory `/root/build/binutils-2.20_cross'
make: *** [all] 错误 2
解决方案:
&1)网上说的在tc-arm.c中加个括号,没研究,可能好用;
&2)在make这一步中,可能会在编译../binutils-2.21/gas/config/tc-arm.c出现gcc把警告当成错误的错误,其原因在于编译该文件时使用了-Werror选项,解决办法是修改../binutils-2.21/gas/configure文件第10624行,把ERROR_ON_WARNING=yes改为ERROR_ON_WARNING=no,保存退出,重新执行make即可。
&3)在配置时,关闭Warning报错,也可以编译成功:(我用的是这种)
[root@localhost binutils-2.20_cross_no_2]# ./configure --target=arm-linux --disable-werror && make
五、建立初始编译器(简版 gcc)
Gcc是最主要的编译器。首先将gcc-4.6.1.tar.gz解压至build-tools,然后将gmp-5.0.2.tar.bz2、mpfr-2.4.2.tar.gz、mpc-0.9.tar.gz分别解压至gcc源码所在目录,并将目录重命名为gmp、mpfr、mpc,然后进入build-boot-gcc目录,进行编译配置,然后make all-gcc并安装,最后make all-target-gcc并安装。实例:
root@ubuntu:/opt/embedded/build-tools# cd /opt/embedded/build-tools/
root@ubuntu:/opt/embedded/build-tools# cp /mnt/hgfs/VMwareShare_Ubuntux64/gcc-4.6.1.tar.gz .
root@ubuntu:/opt/embedded/build-tools# tar -xvf gcc-4.6.1.tar.gz
root@ubuntu:/opt/embedded/build-tools# cd gcc-4.6.1/
root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# cp /mnt/hgfs/VMwareShare_Ubuntux64/mpfr-2.4.2.tar.gz .
root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# cp /mnt/hgfs/VMwareShare_Ubuntux64/gmp-5.0.2.tar.bz2 .
root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# cp /mnt/hgfs/VMwareShare_Ubuntux64/mpc-0.9.tar.gz .
root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# tar -xvf mpfr-2.4.2.tar.gz
root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# mv mpfr-2.4.2/ mpfr
root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# tar -xjf gmp-5.0.2.tar.bz2
root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# mv gmp-5.0.2/ gmp
root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# tar -xvf mpc-0.9.tar.gz
root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# mv mpc-0.9 mpc
这里需要修改一下编译配置文件:/opt/embedded/build-tools/gcc-4.6.1/gcc
/config/arm/t-linux
将“TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer –fPIC”改为
“TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D__gthr_posix_h”。
然后便可以切换到目录build-boot-gcc进行编译了,实例:
root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# cd /opt/embedded/build-tools/build-boot-gcc/
root@ubuntu:/opt/embedded/build-tools/build-boot-gcc# ../gcc-4.6.1/configure --target=$TARGET --prefix=$PREFIX --without-headers --enable-languages=c --disable-threads --with-newlib --disable-shared --disable-libmudflap --disable-libssp
root@ubuntu:/opt/embedded/build-tools/build-boot-gcc# make all-gcc
root@ubuntu:/opt/embedded/build-tools/build-boot-gcc# make install-gcc
root@ubuntu:/opt/embedded/build-tools/build-boot-gcc# make all-target-libgcc
root@ubuntu:/opt/embedded/build-tools/build-boot-gcc# make install-target-libgcc
完成之后,$PREFIX/bin下又多了几个文件:
arm-linux-cpp*
arm-linux-gcc*
arm-linux-gcc-4.6.1*
arm-linux-gcov*
这些生成的文件的作用分别为:
arm-linux-cpp:GNU的C的预编译器
arm-linux-gcc:GNU的C语言编译器
arm-linux-gcc-4.6.1:GNU的C语言编译器,其实和arm-linux-gcc是一样的
arm-linux-gcov:gcc 的辅助测试工具,用来分析和优化程序
六、建立glic库
Glibc是交叉编译环境的运行库。首先将glibc-2.14.tar.gz解压至build-tools,然后将glibc-linuxthreads-2.5.tar.bz2解压至glibc源码所在目录,将glibc-ports-2.13.tar.gz解压至glibc源码所在目录,并重命名为ports。进入build-glibc文件夹,建立用于配置glibc的config.cache文件,然后配置并编译glibc,安装glibc,最后修改libc.so。实例:
root@ubuntu:/opt/embedded/build-tools# cd /opt/embedded/build-tools/
root@ubuntu:/opt/embedded/build-tools# cp /mnt/hgfs/VMwareShare_Ubuntux64/glibc-2.14.tar.gz .
root@ubuntu:/opt/embedded/build-tools# tar -xvf glibc-2.14.tar.gz
root@ubuntu:/opt/embedded/build-tools# cd glibc-2.14/
root@ubuntu:/opt/embedded/build-tools/glibc-2.14# cp /mnt/hgfs/VMwareShare_Ubuntux64/glibc-linuxthreads-2.5.tar.bz2 .
root@ubuntu:/opt/embedded/build-tools/glibc-2.14# tar -xjf glibc-linuxthreads-2.5.tar.bz2
root@ubuntu:/opt/embedded/build-tools/glibc-2.14# cp /mnt/hgfs/VMwareShare_Ubuntux64/glibc-ports-2.13.tar.gz .
root@ubuntu:/opt/embedded/build-tools/glibc-2.14# tar -xvf glibc-ports-2.13.tar.gz
root@ubuntu:/opt/embedded/build-tools/glibc-2.14# mv glibc-ports-2.13/ ports
root@ubuntu:/opt/embedded/build-tools/glibc-2.14# cd ../build-glibc/
建立用于配置glibc的config.cache文件,文件内容为:
libc_cv_forced_unwind=yes
libc_cv_c_cleanup=yes
libc_cv_arm_tls=yes
注:在编译过程中可能会发现本应自动生成的posix/config-name.h并没有自动生成,找不到config-name.h这个文件。这个文件是用来编译uname的。暂时没办法让它自动生成,只好自己比照uname-a的信息建一个config-name.h文件:
在build-glibc目录下建立一个posix目录
# vim build-glibc/posix/config-name.h
在vim编辑器里输入:
/* This file is generated by ../scripts/config-uname.sh.& DO NOT EDIT.
&& This is used only by the generic uname function for systems with no real
&& uname call.& If this data is not correct, it does not matter much.& */
#ifdef config_name_h
#define config_name_h
#define UNAME_SYSNAME “Linux”
#define UNAME_RELEASE “2.6.38-11-generic”
#define UNAME_VERSION “#50-Ubuntu SMP Mon Sep 12 21:18:14 UTC 2011”
#define UNAME_MACHINE “i686”
#endif /* config_name_h */
建立完成之后,便可以开始配置并编译glibc了,实例:
root@ubuntu:/opt/embedded/build-tools/build-glibc# (PATH=$PREFIX/bin:$PATH ) BUILD_CC="gcc" CC=$TARGET-gcc ../glibc-2.14/configure --host=$TARGET --target=$TARGET --prefix=/usr --enable-add-ons --disable-profile --cache-file=config.cache --with-binutils=$PREFIX/bin/ --with-headers=$TARGET_PREFIX/include/&
root@ubuntu:/opt/embedded/build-tools/build-glibc# PATH=$PREFIX/bin:$PATH make
编译出错:
1)checking for suffix of object files... configure: error: in `/opt/embedded/build-tools/build-glibc':
configure: error: cannot compute suffix of object files: cannot compile
See `config.log' for more details
## ----------- ##
## Core tests. ##
## ----------- ##
configure:2363: checking build system type
configure:2377: result: x86_64-unknown-linux-gnu
configure:2397: checking host system type
configure:2410: result: arm-unknown-linux-gnu
configure:2439: checking for arm-linux-gcc
configure:2466: result: arm-linux-gcc
configure:2735: checking for C compiler version
configure:2744: arm-linux-gcc --version &&5
../glibc-2.14/configure: line 2746: arm-linux-gcc: command not found
configure:2755: $? = 127
configure:2744: arm-linux-gcc -v &&5
../glibc-2.14/configure: line 2746: arm-linux-gcc: command not found
configure:2755: $? = 127
configure:2744: arm-linux-gcc -V &&5
../glibc-2.14/configure: line 2746: arm-linux-gcc: command not found
configure:2755: $? = 127
configure:2744: arm-linux-gcc -qversion &&5
../glibc-2.14/configure: line 2746: arm-linux-gcc: command not found
configure:2755: $? = 127
configure:2760: checking for suffix of object files
configure:2782: arm-linux-gcc -c conftest.c &&5
../glibc-2.14/configure: line 2784: arm-linux-gcc: command not found
configure:2786: $? = 127
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "GNU C Library"
| #define PACKAGE_TARNAME "c-library"
| #define PACKAGE_VERSION "(see version.h)"
| #define PACKAGE_STRING "GNU C Library (see version.h)"
| #define PACKAGE_BUGREPORT "glibc"
| #define PACKAGE_URL ""
解决方法:PATH=$PREFIX/bin:$PATH ../glibc-2.14/configure BUILD_CC="gcc" CC=arm-linux-gcc --host=$TARGET --target=$TARGET --prefix=/usr --enable-add-ons --disable-profile --cache-file=config.cache --with-binutils=$PREFIX/bin/ --with-headers=$TARGET_PREFIX/include/ ,在配置前面加上PATH=$PREFIX/bin:$PATH ,虽然你可能已加到bash.bashrc或/etc/profile,即将编译成的arm-linux-gcc设置了环境变量,用arm-linux-gcc -v检查发现已存在,但就是不好使,编译会报错(上述),故在配置前面加上此句。
2)[ALL ]&&&& mawk: scripts/gen-sorted.awk: line 19: regular expression compile failed (bad class -- [], [^] or [)
& &[ALL ]&&&& /[^
&& [ALL ]&&&& mawk: scripts/gen-sorted.awk: line 19: syntax error at or near ]
&& [ALL ]&&&& mawk: scripts/gen-sorted.awk: line 19: runaway regular expression /, "", subd ...
在gen-sorted.awk第19行,出错,这是一个简单的错误,缺少了转义符
解决办法:
& 查找一个看有没有类似的
& cd /tmp/crosstool-ng/targets/src/glibc-cvs-2.9/scripts
sed '/\^\//p' gen-sorted.awk -n
输出的则是存在语法错误的语句
可以直接用
sed -i 's/\^\//\^\\\//g' gen-sorted.awk
& 这种方法不完善,后面的还是会出现错误。
网上搜了下,需要用/usr/bin/gawk 替换/usr/bin/mawk,即
&& sudo apt-get install gawk
&& cd /usr/bin
&& sudo mv mawk mawk.bak
&& sudo ln -s gawk mawk
3)../ports/sysdeps/unix/sysv/linux/arm/sigrestorer.S:30: Error: previous CFI entry not closed (missing .cfi_endproc)
解决方法:
root@ubuntu:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.14/ports/sysdeps/unix/sysv/linux/arm/sigrestorer.S
找到如下行:
ENTRY(__default_sa_restorer)
在其下添加:
END(__default_sa_restorer)
找到如下行:
ENTRY(__default_rt_sa_restorer)
在其下添加:
END(__default_rt_sa_restorer)
4)继续make编译
root@ubuntu:/opt/embedded/build-tools/build-glibc# make
编译出错:
../sysdeps/unix/syscall-template.S:82: Error: CFI instruction used without previous .cfi_startproc
解决方法:
root@ubuntu:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.14/sysdeps/unix/syscall-template.S
找到如下行:
#define T_PSEUDO(SYMBOL, NAME, N)&&&&& &&&&&&&&&&PSEUDO (SYMBOL, NAME, N)
在其上添加:
#define PSEUDO(name, syscall_name, args)&& \
& .& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\
& ENTRY (name);&&&&&&&&&&&&&&&&&&&&&&& \
&&& DO_CALL (syscall_name, args);&&&&&&&& \
&&& cmn r0, $4096;
5)继续make编译
root@ubuntu:/opt/embedded/build-tools/build-glibc# make
编译出错:
allocatestack.c:247:33: 错误:‘TLS_DTV_UNALLOCATED’未声明(在此函数内第一次使用)
解决方法:
root@ubuntu:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.14/nptl/allocatestack.c
root@ubuntu:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.14/elf/dl-tls.c
分别在文件中的include后面添加:
#define TLS_DTV_UNALLOCATED&&&&& ((void *) -1l)
6)继续make编译
root@ubuntu:/opt/embedded/build-tools/build-glibc# make
编译出错:
/opt/embedded/tools/lib/gcc/arm-linux/4.6.1/../../../../arm-linux/bin/ld: cannot find -lgcc_eh
解决方法:
root@ubuntu:/opt/embedded/build-tools/build-glibc# ln -s /opt/embedded/tools/lib/gcc/arm-linux/4.6.1/libgcc.a /opt/embedded/tools/lib/gcc/arm-linux/4.6.1/libgcc_eh.a
7)继续make编译
root@ubuntu:/opt/embedded/build-tools/build-glibc# make
编译出错:
../sysdeps/ieee754/dbl-64/s_fma.c:152:15: 错误:‘FE_TOWARDZERO’未声明(在此函数内第一次使用)
解决方法:
root@ubuntu:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.14/sysdeps/ieee754/dbl-64/s_fma.c
在文件中的include后面添加:
#define FE_TOWARDZERO 0xc00000
#define FE_INEXACT 16
8)继续make编译
root@ubuntu:/opt/embedded/build-tools/build-glibc# make
编译出错:
../sysdeps/ieee754/dbl-64/s_fmaf.c:39:15: 错误:‘FE_TOWARDZERO’未声明(在此函数内第一次使用)
解决方法:
root@ubuntu:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.14/sysdeps/ieee754/dbl-64/s_fmaf.c
在文件中的include后面添加:
#define FE_TOWARDZERO 0xc00000
#define FE_INEXACT 16
9)继续make编译
root@ubuntu:/opt/embedded/build-tools/build-glibc# make
root@ubuntu:/opt/embedded/build-tools/build-glibc# make install_root=$TARGET_PREFIX prefix="" install
10)最后,修改libc.so便完成此步骤
root@ubuntu:/opt/embedded/build-tools/build-glibc# vi ../../tools/arm-linux/lib/libc.so
找到如下行:
GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a& AS_NEEDED ( /lib/ld-linux.so.2 ) )
将其改为:&
GROUP ( libc.so.6 libc_nonshared.a )&
七、建立全套编译器(full gcc)
首先进入build-gcc目录,然后配置并编译full gcc,最后安装就完成了。实例:
root@ubuntu:/opt/embedded/build-tools/build-glibc# cd /opt/embedded/build-tools/build-gcc/
root@ubuntu:/opt/embedded/build-tools/build-gcc# ../gcc-4.6.1/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c,c++ --disable-libgomp
root@ubuntu:/opt/embedded/build-tools/build-gcc# make
root@ubuntu:/opt/embedded/build-tools/build-gcc# make install&
完成之后,$PREFIX/bin下又多了几个文件:
&arm-linux-c++*
arm-linux-g++*
这些生成的文件的作用分别为:
arm-linux-g++:GNU的c++编译器
arm-linux-c++:等同于arm-linux-g++
使用vim编写一个简单文件,这里以hello.c为例:
然后执行编译命令:
root@ubuntu:/opt/embedded/tmp# arm-linux-gcc -static hello.c –o hello
编译完成后验证最终编译出的文件。实例:
root@ubuntu:/opt/embedded/tmp# file hello&
hello: ELF 32-bit LSB executable, ARM, version 1, statically linked, for GNU/Linux 2.0.0, not stripped
有如上输出表示编译ARM版本程序成功。
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥

我要回帖

更多关于 arm linux gcc下载 的文章

 

随机推荐