第4章 gcc
4.0.1 linux非实时操作系统包括RedHat Linux、Fedora、Ubuntu、CentOS等;Linux实时操作系统包括Monta Vista Linux、WindRiver Linux(VxWorks,已被Intel收购)、RTLinux等。
4.1.1 交叉编译器
4.2.1 gcc -E file.c >file.pre.c 得到预处理过的源文件。
从file.pre.c文件总看到大量以#开头的行。每行的格式是“#” 行号 文件名 标志,如
# 35 "/usr/include/stdio.h" 2 3 4
其中“行号”与“文件名”表示从它后一行开始的内容来源于哪个文件的哪一行;
标志可以是1、2、3和4四个数字,每个数字的含义:
数字 | 含义
1 | 表示一个新文件的开始
2 | 表示从一个被包含的文件中返回
3 | 表示后面的内容来自系统头文件
4 | 表示后面的内容应当被当作一个隐式的‘extern “C”’块
4.3.2 gcc -S file.c 得到file.s汇编代码 可以加入-O2优化
4.3.3 gcc -v file.c 获取系统头文件路径
4.3.4 产生映射文件 gcc -W1,-Map=file.map file.c -o file
会生成file.map文件
map文件除了包含nm工具所获取的信息外,还包含各符号来源于哪一个库及库中哪一个目标文件等更为详细的信息。
语法:-Wl(注意是小写的L)用于指定传递给链接器的选项,-Map=file.map(=号换成,亦可以)由gcc传递给链接器以指示链接器为我们生成名为file.map的映射文件。
4.3.5 -DMACRO 相当于在文件中#define MACRO
4.3.6 gcc -M file.c 输出文件的依赖关系(包括系统头文件), -MM输出不包含系统头文件的依赖关系
makefile中可运用此选项生成依赖关系
4.3.7 gcc -o main.c -Lpath -lname 在path路径下寻找名为libname.a的库链接
注意gcc 链接库有顺序
以下为转:
gcc在链接库文件时是从左到右扫描,而且不会重复扫描,这样任何函数的定义应该放在使用者的后面,不同的编译器对这个问题有不同的处理方式,有的编译器可以实现顺序无关,但在没有明确的情况下应该遵循原有的规则。
is to search for external functions from left to right in the object files
specified on the command line. This means that the object file which
contains the definition of a function should appear after any files which
call that function.
of order, but since not all compilers do this it is best to follow the
convention of ordering object files from left to right.
gcc提供了另外的方式的来解决这个问题
g++ -o main main.cpp -L../lib2-64/dict/lib -L../lib2-64/ullib/lib -Xlinker "-(" -ldict -lullib -Xlinker "-)"
可以看到我们需要的库被 -Xlinker "-(" 和 -Xlinker "-)" 包含起来,gcc在这里处理的时候会循环自动查找依赖关系,不过这样的代价就是延长gcc的编译时间,如果使用的库非常的多时候,对编译的耗时影响还是非常大.
-Xlinker有时候也简写成"-Wl, ",它的意思是 它后面的参数是给链接器使用的.-Xlinker 和 -Wl 的区别是一个后面跟的参数是用空格,另一个是用","
g++ -o main main.cpp -L../lib2-64/dict/lib -L../lib2-64/ullib/lib -Wl,"-(" -ldict -lullib -Wl,"-)"
参看:http://www.ibm.com/developerworks/cn/linux/l-cn-linklib/
http://www.cppblog.com/findingworld/archive/2008/11/09/66408.html
http://hi.baidu.com/herejing/blog/item/ca31c8d6d0d9f12206088b0b.html