一、arm-linux-gcc
1. 编译部分:
-o : 后面接的是输出文件名(arm-linux-gcc -o hello hello.c)
-v : 可以观看编译细节 (arm-linux-gcc -v -o hello hello.c)
-c : 预编译,编译和汇编源文件,不做连接 [裸板程序一般先不做连接,最后一起做链接](arm-linux-gcc -o hello.o -c hello.c)
-S : 编译后停止,不进行汇编(arm-linux-gcc -S -o hello.s hello.c)
-E : 预编译后即顶着,不进行编译(arm-linux-gcc -E hello.c)
-g : 产生调试信息
-Wall : 打开所有需要注意的警告信息
2. 优化部分
(注可以指定多个"-O"选项,不管带不带数字,生效的是最后一个)
-O or -O1 : 不使用-O/-O1时,可以减少编译的开销,使编译结果能够调试,语句是独立的,只有声明了register的变量才分配使用寄存器;
使用-O/-O1时,编译器试图减少目标码的大小和执行时间。
-O2 : 多优化一些,除了涉及空间和速度交换的优化选项,执行几乎所有优化工作,例如不进行循环展开和函数内嵌;
-O3 : 优化的更多,除了-O2, 还打开"-finline-functions"
-O0 : 不作优化
3. 链接部分
-llibrary_name : 链接名为library的库文件,真正的名字为liblibrary.a,如要链接libtest.a or libtest.so ,则写成-ltest,如果有动态库,则会优先链接动态库。
-Llibpath : 指定链接库搜索路径,如库都放在/prj/libs/下面,则-L/prj/libs
-nostartfiles : 不连接系统标准启动文件,标准库文件仍然正常使用(编译bootloader,kernel时用到)
-nostdlib : 不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器(编译bootloader,kernel时用到)
[与-nostartfiles的区别是,-nostartfiles只是不包含启动文件]
-static : 在支持dynamic linking的系统上阻止连接共享库[默认情况下会优先选择连接动态库,使用了static会直接连接静态库] (gcc-static -o main main.c func.c)
-shared :生成共享