TQ2440 学习笔记—— 9、嵌入式编程基础知识【arm-linux-gcc 选项】

2019-07-13 06:32发布

(韦东山——嵌入式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 这个选项指出在任何处寻找可执行文件、库文件以及编译器自己的数据文件。