- PC 机上的编译工具链为 gcc、ld、objcopy、objdump 等,它们编译出来的
程序在 x86 平台上运行。要编译出能在 ARM 平台上运行的程序,必须使用交叉编
译工具 xxx-gcc、xxx-ld 等。
1. c/c++编译过程
步骤:预处理(preprocesing)->编译(compilation)->汇编(assembly)->链接(linking)
预处理:预处理功能主要包括宏定义,文件包含,条件编译,去注释等 .i。
编译:在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,
在检查无误后,gcc 把代码翻译成汇编语言 .s
汇编:汇编阶段是把编译阶段生成的“.s”文件转成目标文件 .o
链接:生成可执行文件或库文件 test
gcc -E -o hello.i hello.c (ccl)
gcc -S -o hello.s hello.i
-------------------------
gcc -c -o hello.o hello.s (as)
-------------------------
gcc -o hello hello.o 其他.o
1.1 常用编译选项
1.2 编译多个文件(两个方法)
gcc -c -o test 1.c 2.c
gcc -c -o 1.o 1.c
gcc -c -o 2.o 2.c
gcc -o test 1.o 2.o
1.3 制作、使用动态库
制作:
gcc -c -o main.o main.c
gcc -c -o sub.o sub.c
gcc -shared -o libsub.so sub.o sub2.o sub3.o
gcc -o test main.o -lsub -L /libsub.so/所在目录/
运行:需要把动态库放到板子上
先把 libsub.so 放到 Ubuntu 的/lib 目录,然后就可以运行 test 程序
或者把当前动态库文件的路径加入环境变量:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/a
1.4 使用静态库
gcc -c -o main.o main.c
gcc -c -o sub.o sub.c
ar crs libsub.a sub.o sub2.o sub3.o(可以使用多个.o 生成静态库)
gcc -o test main.o libsub.a (如果.a 不在当前目录下,需要指定它的绝对或相对路径)
(gcc -o test main.o /path/libsub.a
gcc -o test main.o -L /path -lsub)
运行:不需要把静态库 libsub.a 放到板子上。
注意:执行 arm-buildroot-linux-gnueabihf-gcc -c -o sub.o sub.c 交叉编译需要在最后面加上-fPIC 参数
静态库和动态库区别
hf-gcc -c -o sub.o sub.c 交叉编译需要在最后面加上-fPIC 参数