本地编译是指在Linux操作系统上使用与该操作系统相同的CPU架构进行编译。在本地编译中,开发人员可以直接使用GCC等编译器进行编译,非常方便快捷。
编译一个hello world程序的示例命令为:
gcc -o hello hello.c
这将会生成一个可执行文件 hello,可以使用下面的命令来运行程序:
./hello
交叉编译是指使用一台与目标系统不同的计算机(比如使用x86架构的计算机编译ARM架构的代码),通过交叉编译工具链进行编译生成可在目标系统上运行的程序。
交叉编译的优势在于可以在速度较快的开发计算机上进行编译,生成针对目标系统的可执行文件,以节省目标系统上的时间和资源。
编译一个ARM架构的hello world程序的示例命令为:
arm-linux-gnueabi-gcc -o hello_arm hello.c
这将会生成一个针对ARM架构的可执行文件 hello_arm,可以将该文件复制到目标系统上运行。
安装arm架构的gcc命令为
如果你的 Linux 系统上没有安装 arm-linux-gnueabihf-gcc
,可以按照以下步骤进行安装
1、打开终端,并使用 apt-get
命令更新软件包列表:
sudo apt-get update
2、然后使用 apt-get
命令安装 arm-linux-gnueabihf-gcc
sudo apt-get install gcc-arm-linux-gnueabihf
在Linux下,一个C程序的编译过程通常可以分为以下4个阶段:
预处理是指在编译过程中对源代码进行预处理。主要的任务是将源代码中的宏定义、条件编译等预处理指令进行展开,并将结果保存到一个中间文件中。预处理结果包括去掉注释、展开宏定义、加入头文件等。
预处理的命令是 gcc -E
,它将源文件进行预处理后输出到标准输出,我们可以使用重定向将其保存到一个文件中。例如,下面的命令将预处理结果保存到hello.i文件中:
gcc -E hello.c -o hello.i
编译是指将预处理后的代码翻译成汇编代码,同时对代码进行语法检查、类型检查等操作,生成目标文件。目标文件是一种机器码的二进制文件,其中包含了可执行代码和符号表等信息。
编译的命令是 gcc -S
,它将源文件编译成汇编代码,也可以使用 -c
选项生成目标文件。例如,下面的命令将生成汇编代码文件hello.s:
gcc -S hello.c -o hello.s
汇编是指将编译生成的汇编代码翻译成机器码,生成二进制目标文件。汇编器根据汇编代码中的伪指令和操作码来生成机器码。
汇编的命令是 gcc -c
,它将汇编代码转换为机器码生成目标文件,例如:
gcc -c hello.s -o hello.o
链接是将多个目标文件合并成一个可执行文件,同时解析符号引用关系并进行重定位,生成可在系统上运行的二进制文件。
链接的命令是 gcc
,它将多个目标文件链接为一个可执行文件,例如:
gcc hello.o -o hello
其中,hello.o 是目标文件,hello 是可执行文件。在链接过程中,链接器会将 hello.o 中的符号引用解析为实际的地址,并将其与其他库文件链接起来生成可执行文件 hello。
通过这4个阶段,我们可以将C程序编译成可执行文件并在Linux系统上运行。