胖蔡说技术
随便扯扯

Linux 交叉编译

交叉编译是指在一个平台生成另一个平台的可执行代码。如常见的我们需要在电脑平台(linux、Mac、Windows等)通过交叉编译器编译一个C/C++软件库生成一个静态或动态库文件,在我们的移动平台Android或IOS上运行,这个编译的过程就称之为交叉编译。具体的交叉编译产生背景不论,流行和概念不论,如下只讨论交叉编译过程中涉及的具体工具和各个工具所代表的含义。

交叉编译器

交叉编译器又称为交叉编译工具链(cross compilation tool chain),其作用就是将源代码(C/C++)编译生成一个可以运行在目标系统平台的编译工具。其编译过程涉及三个部分:

  • 编译主机
    编译主机通常都是指代电脑主机(linux、Mac、Windows),是编译程序的平台也是安装交叉编译器的平台
  • 目标平台
    使我们期望我们的二进制可执行文件运行的系统的平台
  • 交叉编译器
    就是我们的正主,将源码文件编译成可运行在目标平台的二进制文件的工具

组成

无论是自行安装的本地编译器还是交叉编译工具链,均会提供如下几个工具.

  • CC
    编译器,对C/C++源文件进行编译处理,生成汇编文件,如gcc、clang、TCC等
  • AS 将汇编文件生成目标文件(将汇编文件翻译成机器码)
  • AR
    打包器,由于库操作,可通过该工具从库中增、删目标代码模块
  • LD
    链接器,为之前生成的目标代码分配地址空间,将多个目标文件链接成一个库或可执行文件
  • GDB
    调试工具,可对运行过程中的程序进行代码调试
  • STRIP
    以最终生成的可执行文件或者库文件为输入,然后消除其中的源码
  • NM
    查看静态库文件中的符号表
  • Objdump
    查看静态库或者动态库的方法签名

编译过程

通常我们编译一个C/C++工程主要包括:预处理、编译、汇编、链接四个过程。其中预处理主要是展开头文件/宏替换/去掉注释/条件编译;编译阶段主要是检查代码语法,生成汇编语言;汇编阶段是将汇编代码转换为机器码;链接阶段是将源文件中用到的库函数与汇编生成的目标文件.o合并生成可执行文件。该可执行文件会变大很多,一般是调用自己电脑上的。静态库和应用程序编译在一起,在任何情况下都能运行,而动态库是动态链接,文件生效时才会调用。很多代码编译通过,链接失败就极有可能在静态库和动态库这出现了纰漏,要视情况解决。缺少相关所需文件,就会链接报错。这个时候就要检查下本地的链接库是不是缺损。

程序编译流程

如下显示一个程序编译的整个流程:

#1.编译
$ gcc -c main.cpp ./libmad/mad_decoder.cpp -l ./libmad/include

#2.打包
$ ar cr ../prebuilt/libmedia.a mad_decoder.o

#3.链接
$ g++ -o main main.o -L ../prebuilt -l mdedia
赞(0) 打赏
转载请附上原文出处链接:胖蔡说技术 » Linux 交叉编译
分享到: 更多 (0)

请小编喝杯咖啡~

支付宝扫一扫打赏

微信扫一扫打赏