示例代码
File:a.c:
#include <stdio.h>
int main()
{
printf("hello\n");
}
预编译过程:
这个过程处理宏定义和include,并做语法检查。
可以看到预编译后,代码从5行扩展到了910行。
gcc -E a.c -o a.i
cat a.c | wc -l
5
cat a.i | wc -l
910
编译过程:
这个阶段,生成汇编代码。
gcc -S a.i -o a.s
cat a.s | wc -l
59
汇编过程:
这个阶段,生成目标代码。
此过程生成ELF格式的目标代码。
gcc -c a.s -o a.o
file a.o
a.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped
链接过程:
链接过程。生成可执行代码。链接分为两种,一种是静态链接,另外一种是动态链接。使用静态链接的好处是,依赖的动态链接库较少,对动态链接库的版本不会很敏感,具有较好的兼容性;缺点是生成的程序比较大。使用动态链接的好处是,生成的程序比较小,占用较少的内存。
gcc a.o -o a
程序运行:
./a
hello
选项:
-lLibname :添加名为Libname的库文件,注意没有后缀。
-L Libdir :添加库搜索路径,Libdir。
-I Dir :添加头文件搜索路径,此时先在该路径中搜索,然后按标准顺序搜索。
-include filename :添加头文件
-imacros filename :指明宏文件。宏文件有两种:gcc的宏文件和程序语言的宏文件。
-Dmacroname :定义宏macroname
-Dmacroname=cpp :定义宏macroname的值为cpp;
-Umacro :取消macro的宏定义
-under :取消所有的程序语言宏的宏定义,当然这里的宏是指用上面那三个(-imacros filename、-Dmacroname、-Dmacroname=cpp)选项定义的宏。
-g :生成可调试程序。
GCC文件处理过程:
预编译 :gcc -E main.c -o main.i
编译: gcc -S main.i -o main.s
汇编 :gcc -c main.s -o main.o
连接 :gcc main.o -o main
ccl
as
ldd
cc
添加库:
-I dir
-L dir
-lname
生成库文件:
ar crv libtest.a test.o
gcc -shared -fPCI -o libtest.so test.o
系统头文件
系统库文件(变里为库文件的搜索路径)
/lib
/usr/include
/usr/lib
/usr/local/include
/usr/local/lib
注:目标文件与头文件没有任何关系