(韦东山——嵌入式Linux 应用开发完全手册)
自己刚开始看的时候,总是沉不下心,后面硬是硬着头皮看完!现在再重新看一遍,做下记录!方便以后阅读,因为有些东西挺容易忘的。
一、交叉编译工具选项说明
1、arm-linux-gcc 选项
一个C/C++ 文件要经过预处理、编译、汇编、和链接 等4个步骤才能变成可执行文件;在Windows 下我们只需要单机几个按钮即可编译,但在ARM平台上,我们必须使用交叉编译工具。
预处理:——得到 ” .i “文件。
使用的工具 arm-linux-cpp
编译:——将上述的” .i “文件“翻译”成汇编代码。
使用的工具为ccl(它的名字就是ccl,不是arm-linux-ccl)
汇编:——将上一步的代码翻译成符合一定格式的机器代码,在Linux系统上表现为ELF目标文件。用到的工具为arm-linux-as。
链接:——将上一步生成的OBJ文件和系统库的OBJ文件、库文件链接起来,最终生成可以在特定平台运行的可执行文件。
用到的工具arm-linux-ld。
其他后缀名的文件被传递给链接器,通常包括:“.o”、".a"(归档库文件)
在编译的过程中,除非使用“-c”,"-S"或“-E”选项,否则最后的步骤总是链接。
在链接阶段中,所有对应于源程序的 .o 文件、“-l” 选择指定的库文件、无法识别的文件名(包括指定的 .o 目标文件 和 .a 库文件)按命令 行中的顺序传递给连接器。
2、总体选项
a、 -c
预处理、编译和汇编源文件,但是不作链接,编译器根据源文件生成OBJ文件。
b、-S
编译后即停止,不进行汇编。结果输出汇编文件。
c、-E
预处理后即停止,不进行编译。预处理后的代码送往标准输出。
d、-o file
指定输出文件为 file。无论是预处理、编译、汇编、还是链接,这个选项都可以使用。如果没有使用 -o 选项,默认的输出结果是:可执行文件为a.out。
e、-v
显示制作GCC 工具自身时的配置命令;同时显示编译器驱动程序、预处理器、编译器的版本号。
3、警告选项
“-Wall” 选项基本打开了所有需要注意的警告信息,比如没有指定类型声明、在声明之前就使用的函数、局部变量除了声明就没有再使用等等。
4、调试选项
-g :以操作系统的本地格式产生调试信息,GDB能够使用这些调试信息。
5、优化选项
-O 或-Ol:
-O2:多优化一些
-O3:优化的更多
-O0:不优化
6、链接器选项
1、下面的选项用于连接OBJ文件,输出可执行文件或库文件。
(1)object-file-name
如果某些文件没有特别明确的后缀,GCC 就认为它们是OBJ 文件或库文件。如果GCC 执行链接操作,这些OBJ文件将成为链接器的输入文件。
例子:gcc -o test main.o sub.o
(2)-llibrary
链接名为library的库文件。
例子:gcc -v -o test main.o sub.o 不明链接,用 -v 可以查看。
(3)-nonstartfiles
不链接系统标准启动文件,而标准文件仍然正常使用。在编译bootloader、内核时,将用到这个选项。
例子:gcc -v -nonstartfiles -o test main.o sub.o
(4)-nostdlib
不链接系统标准启动文件和标准库文件,只把指定文件传递给链接器。这个选项常用于编译内核、bootloader等程序,它们不需要启动文件、标准库文件。
例子:gcc -v -nonstdlib -o -test main.o sub.o
(5)-static
在支持动态链接的系统上阻止链接共享库。
(6)-shared
生成一个共享OBJ 文件,它可以和其他OBJ 文件链接产生可执行文件。只有部分系统支持该选项。
(7)-Xlinker option
把选项 option 传递给链接器。
(8)-Wl, option
把选项option 传递给链接器。
(9)-u symbol
使链接器认为取消了symbol 的符号定义,从而链接库模块以取得定义。
7、目录选项
下列选项指定搜索路径,用于查找头文件、库文件或编译器的某些成员。
(1)-Idir
在头文件的搜索路径列表中添加dir 目录。
(2)-I-
任何在“ -I- ” 前面用“ -I- ” 选项指定的搜索路径只适用与“#include "file" ”这种情况;它们不能用来搜索“#include
” 包含的头文件。
(3)-Ldir
在“ -I ” 选项的搜索路径列表中添加dir 目录。
(4)-Bprefix
这个选项指出在任何处寻找可执行文件、库文件以及编译器自己的数据文件。