1 GCC相关概念
gcc编译器通常是由多达六七个稍小的程序所组成,这些程序是由一个叫编译器驱动程序来调用。从宏观角度讲编译器有以下几个可分离出来的单独程序,包括:预处理器(preprocessor)、编译器(compiler,又分为两个部分:前端,进行语法和语义解析,生成一抽象语法树;后端,进行代码生成和相关的代码优化)、汇编器(assembler)、链接器(linker)
1.选项 -E : 预编译过程,处理宏定义和include,并作语法检查
gcc -E hello.c -o hello.i #将hello.c预处理输出为hello.i文件
2.选项 -S : 编译过程,生成通用的汇编代码
gcc -S hello.c #生成汇编代码hello.s
3.选项 -c : 汇编过程,生成ELF格式的可重定位目标文件,目标文件(机器代码,),用文本编辑器打开是乱码
gcc -c hello.c #生成目标代码hello.o(中间文件),不能执行,在Makefile中应用广泛
4.选项 -L : 链接过程,将.o文件与所需库文件链接合并成ELF格式的可执行目标文件,分静态链接和动态链接
gcc hello.o -L dir(如./lib) #指定库搜索路径,有多个则从前往后搜索
5.选项 -l : 链接过程,指定链接库,库命名规则是libxxx.a,指定库名时使用的格式是-lxxx
gcc hello.c -o hello -lm #链接数学库
ld -o hello hello.o -lxxx #链接xxx库
6.选项 -o : 将源文件预处理、编译、汇编并链接形成可执行目标文件,-o选项指定可执行文件的文件名,加载到内存中即可执行
gcc hello.c -o hello #生成可执行文件hello
7.部分选项:
选项 -Wall : 编译时打开警告信息开关
选项 -D : 在文件中定义宏INFO,编译时加上-D INFO使其生效
选项 -O : 后指定数字,使用编译优化级别1~3优化程序
选项 -g : 产生调试信息
8.选项 -static : 使用静态链接库,将使用的静态库对象嵌入至可执行映像文件中,加载时无需进一步的链接
gcc -c -Wall x1.c x2.c #生成目标文件
ar -crulibxxx.a x1.o x2.o #创建静态库
#定义静态库的应用接口xxx.h,里面显式引用上面的源文件函数和对象
gcc -O2 -c main.c #测试用例调用静态库的函数
gcc -static -o p main.o ./libxxx.a #链接静态库和目标文件生成可执行文件p
9.选项 -share : 使用共享库,在运行时动态加载目标程序所需要的信息
选项 -fPIC : 指示编译器生成与地址无关的目标文件(position-independentcode)
gcc -shared -fPIC -o libxxx.so x1.cx2.c #生成共享库libvector.so
gcc -o p1 main.c ./libvector.so #共享库中的目标对象并未嵌入可执行文件中,执行时完成链接过程
最后由链接器ld合并到的可执行文件hello就可被加载到内存中,由系统执行。