当前位置:求职简历网 > 知识 > 正文

toolchain

如何安装ARM toolchain 我们有两个选择,第一是直接在 Raspberry Pi 上编译。第二是先在我们的个人电脑用 Raspberry Pi 的 toolchain 编译完成後,再上传到 Pi。 这里简介如何在个人电脑安装 R

如何安装ARM toolchain

  我们有两个选择,第一是直接在 Raspberry Pi 上编译。第二是先在我们的个人电脑用 Raspberry Pi 的 toolchain 编译完成後,再上传到 Pi。
  这里简介如何在个人电脑安装 Raspberry Pi 的 toolchain,以在 ubuntu 上安装 gcc-linaro-arm-linux-gnueabihf-raspbian 为例。
  1. 在个人电脑安装必要的套件。
  sosorry@ubuntu:~$ sudo apt-get install make git-core ncurses-dev
  2. 下载最新版的 toolchain。
  sosorry@ubuntu:~$ mkdir rpi
  sosorry$ubuntu:~$ cd rpi
  sosorry@ubuntu:~/rpi$ git clone https://github.com/raspberrypi/tools.git
  remote: Reusing existing pack: 17273, done.
  remote: Total 17273 (delta 0), reused 0 (delta 0)
  Receiving objects: 100% (17273/17273), 311.52 MiB | 343 KiB/s, done.
  Resolving deltas: 100% (11698/11698), done.
  Checking out files: 100% (15860/15860), done.
  3. 安装 toolchain。安装方法是将 gcc-linaro-arm-linux-gnueabihf-raspbian 加到环境变数里。
  sosorry@ubuntu:~/rpi$ vi ~/.bashrc
  export PATH=$PATH:/home/sosorry/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin # add this line at the end of file
  4. 测试。先开启一个新的终端机,输入 arm 後连续按两次 tab 键,如果跑出来一堆像下面的提示表示安装成功。
  arm-linux-gnueabihf-addr2line arm-linux-gnueabihf-gcc arm-linux-gnueabihf-gfortran arm-linux-gnueabihf-objdump
  arm-linux-gnueabihf-ar arm-linux-gnueabihf-gcc-4.7.2 arm-linux-gnueabihf-gprof arm-linux-gnueabihf-pkg-config
  arm-linux-gnueabihf-as arm-linux-gnueabihf-gcc-ar arm-linux-gnueabihf-ld arm-linux-gnueabihf-pkg-config-real
  arm-linux-gnueabihf-c++ arm-linux-gnueabihf-gcc-nm arm-linux-gnueabihf-ld.bfd arm-linux-gnueabihf-ranlib
  arm-linux-gnueabihf-c++filt arm-linux-gnueabihf-gcc-ranlib arm-linux-gnueabihf-ldd arm-linux-gnueabihf-readelf
  arm-linux-gnueabihf-cpp arm-linux-gnueabihf-gcov arm-linux-gnueabihf-ld.gold arm-linux-gnueabihf-size
  arm-linux-gnueabihf-elfedit arm-linux-gnueabihf-gdb arm-linux-gnueabihf-nm arm-linux-gnueabihf-strings
  arm-linux-gnueabihf-g++ arm-linux-gnueabihf-gdbtui arm-linux-gnueabihf-objcopy arm-linux-gnueabihf-strip


怎么替换raspberry的toolchain

我们有两个选择,第一是直接在 Raspberry Pi 上编译。第二是先在我们的个人电脑用 Raspberry Pi 的 toolchain 编译完成後,再上传到 Pi。
这里简介如何在个人电脑安装 Raspberry Pi 的 toolchain,以在 ubuntu 上安装 gcc-linaro-arm-linux-gnueabihf-raspbian 为例。
1. 在个人电脑安装必要的套件。
sosorry@ubuntu:~$ sudo apt-get install make git-core ncurses-dev

2. 下载最新版的 toolchain。
sosorry@ubuntu:~$ mkdir rpi
sosorry$ubuntu:~$ cd rpi
sosorry@ubuntu:~/rpi$ git clone https://github.com/raspberrypi/tools.git
remote: Reusing existing pack: 17273, done.
remote: Total 17273 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (17273/17273), 311.52 MiB | 343 KiB/s, done.
Resolving deltas: 100% (11698/11698), done.
Checking out files: 100% (15860/15860), done.

3. 安装 toolchain。安装方法是将 gcc-linaro-arm-linux-gnueabihf-raspbian 加到环境变数里。
sosorry@ubuntu:~/rpi$ vi ~/.bashrc
export PATH=$PATH:/home/sosorry/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin # add this line at the end of file

4. 测试。先开启一个新的终端机,输入 arm 後连续按两次 tab 键,如果跑出来一堆像下面的提示表示安装成功。
arm-linux-gnueabihf-addr2line arm-linux-gnueabihf-gcc arm-linux-gnueabihf-gfortran arm-linux-gnueabihf-objdump
arm-linux-gnueabihf-ar arm-linux-gnueabihf-gcc-4.7.2 arm-linux-gnueabihf-gprof arm-linux-gnueabihf-pkg-config
arm-linux-gnueabihf-as arm-linux-gnueabihf-gcc-ar arm-linux-gnueabihf-ld arm-linux-gnueabihf-pkg-config-real
arm-linux-gnueabihf-c++ arm-linux-gnueabihf-gcc-nm arm-linux-gnueabihf-ld.bfd arm-linux-gnueabihf-ranlib
arm-linux-gnueabihf-c++filt arm-linux-gnueabihf-gcc-ranlib arm-linux-gnueabihf-ldd arm-linux-gnueabihf-readelf
arm-linux-gnueabihf-cpp arm-linux-gnueabihf-gcov arm-linux-gnueabihf-ld.gold arm-linux-gnueabihf-size
arm-linux-gnueabihf-elfedit arm-linux-gnueabihf-gdb arm-linux-gnueabihf-nm arm-linux-gnueabihf-strings
arm-linux-gnueabihf-g++ arm-linux-gnueabihf-gdbtui arm-linux-gnueabihf-objcopy arm-linux-gnueabihf-strip

让我们实际写一个 hello.c 并编译它吧。
sosorry@ubuntu:~/rpi$ vi hello.c
#include
int main()
{
printf("hello, world\n");
return 0;
}

用 Raspberry Pi 的 toolchain 编译 hello.c。这一步骤称为交叉编译(cross-compiling)。
sosorry@ubuntu:~/rpi$ arm-linux-gnueabihf-gcc hello.c -o hello-arm

让我们看看档案的资讯,可以看到该档案是 ARM 的格式。
sosorry@ubuntu:~/rpi$ file hello-arm
hello-arm: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, not stripped

如果我们在 x86 环境下试著执行会发现无法成功。
sosorry@ubuntu:~/rpi$ ./hello-arm
bash: ./hello-arm: cannot execute binary file

我们把 hello-arm 上传到我们的 Pi,假设 IP 为 192.168.1.2。
sosorry@ubuntu:~/rpi$ scp hello-arm pi@192.168.1.2:/home/pi
pi@192.168.1.2's password:
hello-arm 100% 5447 5.3KB/s 00:00

在我们的 Pi 上执行,看看结果吧。
pi@raspberrypi:~$ ./hello-arm
hello, world


ubuntu下怎么安装交叉编译

1. 下载软件包
从linaro的网站下载预编译二进制包,
注意选择的版本哦,我们要使用linux下的哦。选择这个:
gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux.tar.bz2
2. 解压
解压gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux.tar.xz 到 ~/arm-cross-toolchain/目录下
3. 设置环境变量
~$ vi .bashrc

在最后添加如下 2 行:
PATH=$PATH:/home/lxl/arm-cross-toolchain/gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux/bin
export PATH
请注意,第一行的$PATH后面是英文冒号,而冒号后面是你的cross-toolchain的可执行文件目录(bin目录)的绝对路径。 这两句的意思就是将cross-toolchain的可执行文件路径加入系统环境变量PATH中。
4. 使环境变量 生效
~$ source .bashrc
5. 测试
~$ arm-linux-gnueabihf-gcc -v
报错:arm-linux-gnueabihf-gcc: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

原因:64位的系统,缺少 lib32stdc++6这个包
解决:~$ sudo apt-get install lib32stdc++6


怎样编译生成lib文件啊?

比如你在VC6.0有一个工程project,里面有以下3个文件

/*1*/fun.h
#ifndef FUN_H
#define FUN_H
void fun();
#endif

/*2*/fun.c
#include
#include "fun.h"
void fun()
{
printf("fun()");
}

/*3*/main.c
#include
#include "fun.h"
int main()
{
fun();
getchar();
}

菜单project->setting->link
把输出文件名“Debug/project.exe”改成“Debug/project.lib”,确定
按F7组建project.lib
这样在你的project\Debug文件夹下就可以找到project.lib了


怎么看lib文件

前提是你必须正确的使用,否则编不过的
反过来说,如果你能正确的用,你也就可以自己写一个h文件了,哈哈。
或者说,你如果要使用一个lib,在没有h文件的情况下,是很难的

2、有这样的软件,可以看懂lib里面的东西,比如dumpbin.exe
通常windows系统里面的lib文件是COFF格式的,网上有很多COFF格式的介绍,你可以看下
VC各个版本的开发环境,生成的LIB文件,都是采用COFF格式的
开发环境自带的有个dumpbin.exe的文件,可以把lib文件解出来,方便分析其内部的东西的。

但BORLAND公司出的开发环境,也许使用的CMF格式的,网上也有介绍的。
而嵌入式开发环境下的LIB文件,通常采用的是ELF的格式


如何在Android中使用汇编语言

 由于Android环境非常复杂,框架都是用Java,因此要使用C/C++都需要做很多配置,使用汇编的话需要做更多的工作。
  我这边使用的是最新的Android4.0的开发工具,NDK也是最新支持4.0的。这个NDK与老版本的有一些比较明显的不同。
  由于我用的是Mac OS X,因此配置起来比瘟抖死上的要容易许多,你不需要再装些杂七杂八的第三方工具,直接可以使用你下载好的NDK。
  首先,设置目标路径——在你的Terminal中进入NDK的根目录,随后打NDK_PROJECT_PATH=""。回车,再输入export NDK_PROJECT_PATH
  回车。
  这里要注意的是NDK_PROJECT_PATH=后面的路径需要加引号,否则无效。
  由于NDK默认支持的默认编译选项仅支持ARMv5到ARMv5TE架构,因此如果要使用比较高级的特性的话有两种方法:
  1、你有办法将TARGET_ARCH_ABI的值变为armeabi-v7a,俺自己试了一下,木有成功。因此可以使用第二种方法,更简单便捷:
  2、在你的NDK目录下,找到toolchains,然后找到arm-linux-androideabi-x.y.z目录,在进去可以发现setup.mk文件。找到-march=armv7-a,将上面的神马#ifdef都去掉,下面的#endif也都删了。这样就能确保编译器使用ARMv7A来编译。
完成上述操作之后我们就可以先用最简单的方式来写汇编了,即内联汇编——

  static int my_thumb(int dummy)
  {
  __asm__("movw r0, #1001 \t\n"
  "movw r12, #2020 \t\n"
  "add r0, r0, r12 \t\n"
  "bx lr");
  
  return dummy;
  }
   
  jstring
  Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
  jobject thiz )
  {
  my_thumb(0);
  return (*env)->NewStringUTF(env, "Hello from JNI !");
  }
  

  上述代码其实就是基于NDK自带的hello-jni项目修改的。最后用ndk-build可以成功编译。

  上面一段代码是编译器默认的使用Thumb/Thumb-2编译的,因此我里面写的内联汇编的指令都是Thumb代码。
  我们下面将讲述一下如何使用ARM代码并使用NEON指令集。
  首先,在你的Android.mk中修改LOCAL_SRC_FILES,要将源文件名后面添加.neon后缀,比如LOCAL_SRC_FILES := hello-jni.c改成LOCAL_SRC_FILES := hello-jni.c.neon。
  这里要注意的是你真正的源文件名不要修改,就修改LOCAL_SRC_FILES这个符号的值即可。
  然后我们再添加新的变量,来指示ARM GCC使用ARM指令集来编译——LOCAL_ARM_MODE := arm
  这样就OK了。我们修改一下代码:

  static int my_arm(int dummy)
  {
  __asm__("movw r0, #1001 \t\n"
  "movw r12, #2020 \t\n"
  "add r0, r0, r12 \t\n"
  "vdup.32 q0, r0 \t\n"
  "bx lr");
  
  return dummy;
  }
   
  jstring
  Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
  jobject thiz )
  {
  my_arm(0);
  return (*env)->NewStringUTF(env, "Hello from JNI !");
  }
  

  使用ndk-build后能正常通过编译。
最后再上个最最高端的。直接写汇编文件。NDK带有GAS工具,因此按常理,完全可以写汇编文件。一般汇编文件的后缀名为.s,因此我们创建一个xxx.s文件即可。
  然后我这边创建一个叫hey.s。在Android.mk中将这个文件添加上:LOCAL_SRC_FILES += hey.s.neon
  我们这里看到,为了能在汇编文件中使用NEON指令集,我们在这里也把.neon后缀添加上。汇编器的makefile也认这个标识。
  我们编辑hey.s文件:

  .text
.align 4
.arm
.globl my_real_arm
my_real_arm:
add r0, r0, #256
vmov q0, q1
vdup.32 q0, r0
bx lr
这里要注意的是,在Apple的汇编器中,函数名要加前缀下划线,而NDK中提供的汇编器则不需要。
  我们修改一下hello-jni.c,把这函数调进去:

  extern void my_real_arm(int i);
  
  static int my_arm(int dummy)
  {
  __asm__("movw r0, #1001 \t\n"
  "movw r12, #2020 \t\n"
  "add r0, r0, r12 \t\n"
  "vdup.32 q0, r0 \t\n"
  "bx lr");
  
  return dummy;
  }  
  jstring
  Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
  jobject thiz )
  {
  my_real_arm(0);
  my_arm(0);
  return (*env)->NewStringUTF(env, "Hello from JNI !");
  }  
  当然,我们为了确保编译器能够正确地将ARM和Thumb指令集做混合连接,我们可以在刚才的setup.mk中强制在TARGET_CFLAGS标志里加上-mthumb-interwork
  在Windows操作系统中试验,终于发现,只要将Application.mk中的APP_ABI中的标志,将armeabi去掉,仅留下armeabi-v7a就能顺利使用neon了。这样不需要修改setup.mk,也不需要将Sample中的那个标志判断去掉,非常方便。
  下面列一下可用的Android.mk编译配置文件:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := HelloNeon
LOCAL_SRC_FILES := helloneon.c
LOCAL_ARM_MODE := arm
TARGET_CFLAGS += -mthumb-interwork
TARGET_CFLAGS += -std=gnu11
TARGET_CFLAGS += -O3
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
LOCAL_CFLAGS := -DHAVE_NEON=1
LOCAL_SRC_FILES += neontest.s.neon
LOCAL_ARM_NEON := true
endif
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
$(call import-module,cpufeatures) 
  在使用JNI时,只需要在你当前项目工程目录中添加jni文件夹,然后在里面根据Sample中所提供的文件布局来做即可。当你用ndk-build(Windows下要在cygwin控制台中用ndk-build.cmd)来编译时, 如果构建成功,则会在libs文件夹内生成一个libXXX.so。然后用Eclipse ADT重新打开你的项目工程,就会发现jni文件目录以及生成好的so文件都会在你的工程文件目录中展现出来。当然,你后面也能直接在Eclipse IDE下编辑.s汇编文件,这样就更容易阅读了。
  最后,在Android汇编器中如果要注释某条语句,那么必须使用C89/90中的注释符——/* ... */
  用分号以及后来C++98中所引入的//形式都不管用。
在最新的NDK版本android-ndk-r8d中加入了ARM-Linux GCC4.7以及当前大红大紫的LLVM Clang3.1。不过由于LLVM Clang3.1的很多编译选项与GCC有不少区别,因此在使用Clang3.1的时候需要自己去配置相应的编译选项。这个版本的NDK默认的编译器工具链使用的是GCC4.6版本。如果要使用GCC4.7,那么可以在Application.mk文件中添加NDK_TOOLCHAIN_VERSION=4.7;如果要使用Clang3.1,那么可以在Application.mk中添加NDK_TOOLCHAIN_VERSION=clang3.1。下面给出一个合法的Application.mk的内容:

  # Build with LLVM Clang3.1
#NDK_TOOLCHAIN_VERSION=clang3.1

# Build with ARM-Linux GCC4.7
NDK_TOOLCHAIN_VERSION=4.7

# Build only ARMv7-A machine code.
APP_ABI := armeabi-v7a


输入:arm-none-linux-gnueabi-gcc -v 出现: No such file or directory

估计是你的arm-none-linux-gnueabi-gcc文件放到PATH路径了,但是它本身是一个链接文件,实际连接到这个位置:/home/lin/kernel/arm-2010q1/bin/arm-none-linux-gnueabi-gcc,而这个文件实际是不存在的。
你可以用命令查查看,比如我本机的例子:先找到文件完整路径,再看它属性
root$ which gcc
/usr/bin/gcc

root$ ls -l /usr/bin/gcc
-rwxr-xr-x 2 root root 197448 2007-01-18 /usr/bin/gcc


arm-linux-gcc 和 arm-elf-gcc 的区别

在基于ARM的嵌入式系统开发中,常常用到交叉编译的GCC工具链有两种:
arm-linux-*和 arm-elf-*,两者区别主要在于使用不同的C库文件。arm-linux-*使用
GNU的Glibc,而arm-elf-*一般使用 uClibc/uC-libc或者使用REDHAT专门为嵌入式系统
的开发的C库newlib.Glibc。uClibc/uC-libc以及 newlib都是C语言库文件,只是所应
用的领域不同而已,Glibc是针对PC开发的,uClibc/uC-libc是与Glibc API兼容的小型
化C语言库,实现了Glibc部分功能。


  关于uClibc/uC-libc的说明,详见如下:


  There are two libc libraries commonly used with uClinux. uC-libc and
uClibc. They are quite different despite their similar names. Here is a
quick overview of how they are different.


  uC-libc is the original library for uClinux. It was based on sources
from the Linux-8086 C library which was part of the ELKs project with m68000
support added by Jeff Dionne and Kenneth Albanowski. It is a fairly complete
libc implementation, however, some of the API's are a little non-standard
and quite a few common libc routines are not present. Currently it has
stable support for m68000, ColdFire and ARM (Non-MMU) architectures. It was
primary design goal is to be small and light weight. It does try to conform
to any standards, although its API tries to be compatible with most libcs,
it is not always exactly the same.


  The uClinux distribution provides an environment that can compile using
either uC-libc or uClibc depending on your needs. For m68000 and Coldfire
platforms it is generally better to chose uC-libc as it supports shared
libraries and is the most commonly used libc for these CPUs. uClibc also
works quite well with almost all platforms supported by the distribution.
Which libc you choose to use will be decided by your requirements


uClinux有两个经常使用的libc库:uC-libc和uClibc。虽然两者名字很相似,其实有差
别,下面就简单的介绍一下二者的不同之处。uC -libc是最早为uClinux开发的库,是
Jeff Dionne和Kenneth Albanowski为在EKLs项目中支持m68000在Linux-8086 C库源码
上移植的。uC-libc是一个完全的libc实现,但其中有一些api是非标准的,有些libc的
标准也没有实现。uC-libc稳定地支持 m68000,ColdFire和没有MMU的ARM。其主要设计
目标是“小”、"轻",并尽量与标准一致,虽然它的API和很多libc兼容,但是似乎并
不像它期望的那样和所有标准一致。


uClibc就是为了解决这个问题从uC-libc中发展出来的。它的所有API都是标准的(正确
的返回类型,参数等等),它弥补了uC-libc中没有实现的libc标准,现在已经被移植到
多种架构中。一般来讲,它尽量兼容glibc以便使应用程序用uClibc改写变的容易。
uClibc能够在标准的 VM linux和uClinux上面使用。为了应用程序的简洁,它甚至可以
在许多支持MMU的平台上被编译成共享库。Erik Anderson在uClibc背后做了很多的工
作。uClibc支持许多系列的处理器:m68000,Coldfire,ARM,MIPS,v850, x86,
i960,Sparc,SuperH,Alpha,PowerPC和Hitachi 8。不断增加的平台支持显示uClibc
能够很容易的适应新的架构。uClinux发行版提供了环境能够让你选择使用uC-libc或是
uClibc编译。对于m68000和Coldfire平台来说,选择uC-libc还是稍微好一点,因为它
支持共享库,而共享库是这些cpu经常使用的 libc.uClibc也几乎和所有的平台都能很
好的工作。选择哪种libc取决于你的需求。


newlib 是一个用于嵌入式系统的开放源代码的C语言程序库,由libc和libm两个库组
成,特点是轻量级,速度快,可移植到很多CPU结构上。newlib实现了许多复杂的功
能,包括字符串支持,浮点运算,内存分配(如malloc)和I/O流函数(printf,fprinf()
等等)。其中libc提供了c 语言库的实现,而libm提供了浮点运算支持。


在为ARM交叉编译gcc编译器时,对gcc指定不同的配置选项时,使用的C语言库就不同,
gcc编译器默认使用Glibc,也可以使用 uClibc/uC-libc(基本兼容Glibc API),当使用
--with-newlib时,gcc编译器不使用Glibc。当没有交叉编译Glibc时,可以使用
--with-newlib禁止连接Glibc而编译bootstrap gcc编译器。从gcc源目录下的
config/arm中的t-linux和t-arm-elf中可以看出,不同的--target也影响gcc连接C语言
库,t-linux(--target=arm-linux)默认使用Glibc,-arm-elf(--target=arm-elf)使用
- Dinhibit_libc禁止连接Glibc,这时我们就可以使用newlib等其他C语言库编译GCC工
具链。


虽然GCC工具链配置了不同的的C语言库,但由于这些C语言库都可以用来支持GCC,它们
对核心数据的处理上不存在较大出入。因而arm-linux-* 和 arm-elf-*区别主要表现在
C语言库的实现上,例如不同系统调用,不同的函数集实现,不同的ABI\启动代码以及
不同系统特性等微小的差别。


arm-linux-*和 arm-elf-*的使用没有一个绝对的标准,排除不同库实现的差异,gcc可
以编译任何系统。arm-linux-*和 arm-elf-*都可以用来编译裸机程序和操作系统,只
是在遵循下面的描述时系统程序显得更加协调:


arm-linux-*针对运行linux的ARM机器,其依赖于指定的C语言库Glibc,因为同样使用
Glibc的linux而使得arm-linux-*在运行linux的ARM机器上编译显得更加和谐。


arm-elf-*则是一个独立的编译体系,不依赖于指定的C语言库Glibc,可以使用newlib
等其他C语言库,不要求操作系统支持,当其使用为嵌入式系统而设计的一些轻巧的C语
言库时编译裸机程序(没有linux等大型操作系统的程序),如监控程序,bootloader等

能使得系统程序更加小巧快捷。


Linaro prebuilt toolchain does support both hard and soft floating
point. You can get it from https://launchpad.net/linaro-toolchain-binaries/+milestone/2012.08 try: ./arm-linux-gnueabihf-gcc -print-multi-lib

The default configure is --with-arch=armv7-a --with-tune=cortex-a9
--with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb

To use soft floating, you need options: -marm -march=armv4t -mfloat-abi=soft.

In your case, please try to change -march=armv5 to "-march=armv4t"

If you want to change to configure to cortex-a8 and armv5. You need
* Change cortex-a9 to cortex-a8 in
samples/linaro-arm-linux-gnueabihf/crosstool.config
* Change armv4t to armv5 in
contrib/linaro/patches/gcc/linaro-4.7-2012.08/multilib.patch,

Then follow the instructions to rebuild the toolchain
(contrib/linaro/doc/README.txt)

BTW: crosstool-ng-linaro does not support multilib for eglibc. It uses
the prebuilt sysroot from Ubuntu Precise. If it does not work for you,
please use the latest crosstool-ng from http://crosstool-ng.org/.


如何安装ARM toolchain

主机安装工具链: $tar –jxvf cross-3.3.2.tar.bz2 $./3.3.2/bin/arm-linux-gcc –v 现信息:--prefix=/usr/local/arm/3.3.2 GCC应该安装路径GCC编译前通prefix选项配置 $mkdir –p /usr/local/arm $mv ./3.3.2 /usr/local/arm/ $export PATH=$PATH:/usr/local/arm/3.3.2/bin直接使用arm-linux-gcc命令 我太傻述已经交叉编译环境搭建(用再额外glibcbintilsCross本身已经包括glibcbintils交叉工具链载址: ) arm-linux-ar -r arm-linux-ar –s arm-linux-ranlib arm-linux-gcc arm-linux-objdump –a arm-linux-objdump -h arm-linux-objdump –d arm-linux-readelf –h arm-linux-readelf -e


如何在ubuntu中搭建交叉编译环境toolchain

1.安装交叉编译环境 sudo apt-get install gcc g++ libcc1 libg++ make gdb2.安装交叉编译器 ftp://ftp.arm.linux.org.uk/pub/armlinux/toolchain/ 下载 cross -3.2.tar.bz2或者懒得去找干脆wget ftp://ftp.arm.linux.org.uk/pub/armlinux/toolchain/ cross -3.2.tar.bz2解压sudo tar jxvf /home/zhaifang/cross -3.2.tar.bz2sudo mv /home/zhaifang/usr/local/arm /usr/local3.交叉编译器加入路径 sudo vi /etc/bash.bashrc后面加入if [ -d /usr/local/arm ] ; thenPATH=/usr/local/arm/bin:'${PATH}'fi4.使环境生效 #source /etc/profile5.检查 echo $PATH 出现/usr/local/arm/bin说明成功了6.测试 arm-linux-gcc -v


ubuntu 能用64位的交叉编译器吗

安装步骤
1、将压缩包arm-linux-gcc-4.4.3.tar.gz存放在一个目录下,这个目录就是你等会解压缩的目录,以后这个目录就不能随便删掉了

2、使用tar命令:tar zxvf arm-gcc-4.4.3.tar.gz将software文件夹下的arm-linux-gcc-4.4.3.tar.gz解压缩安装到当前目录下如下图


通过下图可以看到解压成功了,并且解压后的文件存放了/home/song/software/opt/FriendlyARM/toolschain/4.4.3文件夹下,如下图所示,这个存放路径可得记住,如下图


3、接下来配置系统环境变量,把交叉编译工具链的路径添加到环境变量PATH中去,这样就可以在任何目录下使用这些工具。记下上一步中的安装路径,使用命令:vim /etc/profile 编辑profile文件,添加环境变量。

在profile中最后一行添加: export PATH=$PATH:/home/song/software/opt/FriendlyARM/toolschain/4.4.3/bin 这个路径就是那个bin目录所在的路径,可能你的不一样,按照你实际的目录填就可以了,如下图32行

编写完保存就好了
4、使用命令:source /etc/profile 使环境变量生效
5、在终端上输入命令 arm-linux 再按Tab键,可以看到下图,说明环境变量设置成功了

6、使用命令:arm-linux-gcc -v 会出现下面的错误提示:/home/song/software/opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux-gcc: 15: exec: /home/song/software/opt/FriendlyARM/toolschain/4.4.3/bin/.arm-none-linux-gnueabi-gcc: not found

说是出现这种问题的原因是由于Ubuntu12.04用的是64位的,解决方法就是使用命令:sudo apt-get install ia32-libs 装一些32位的库

7、待安装完32位的库之后,再使用命令:arm-linux-gcc -v,这一次就成功了,如下图

8、验证,编译一个hello.c文件

使用命令:arm-linux-gcc hello.c -o hello 看是否编译成功


如何快速使用上C++11

1) 安装高版本的gcc,这里以安装gcc 4.8为例:

sudo add-apt-repositoryppa:ubuntu-toolchain-r/test

sudo apt-get update; sudo apt-get installgcc-4.8 g++-4.8


2) 光装好高版本的gcc还不行,还要让gcc4.8为当前的使用版本:

sudo update-alternatives --remove-all gcc

sudo update-alternatives --remove-all g++

sudo update-alternatives --install /usr/bin/gccgcc /usr/bin/gcc-4.8 20

sudo update-alternatives --install /usr/bin/g++g++ /usr/bin/g++-4.8 20

sudo update-alternatives --config gcc

sudo update-alternatives --config g++


安装完毕后可以检查使用的版本:

gcc --version

或者

gcc -v


C语言中,switch选择结构中必须有default子句,对吗?

不一定需要。default语句是为了处理switch开关变量不再所列出的case标签中时的情况。
假如,你的switch选择变量在进入switch之前就做了检查处理,或者你根本不在乎意外情况的出现,那么,default就不需要了。
但是,作为统一约定和代码的安全,建议都加上default语句。
还有一点是:default语句后不需要加上break语句,但是一般都会加上。

养成好的编码习惯很重要。


知识相关

知识推荐

求职简历网为你分享个人简历、求职简历、简历模板、简历范文等求职简历知识。

Copyrights 2018-2024 求职简历网 All rights reserved.