C编译连接流程
GCC中一些偏僻的扩展名
扩展名 |
含义 |
.C
C++源代码文件
.i
预处理过的C源代码文件
.ii
预处理过的C++源代码文件
.m
Objective-C源代码文件
.out
链接器生成的可执行文件
.s
汇编语言源代码文件,后期不再进行预处理操作
.S
汇编语言源代码文件,后期还会进行预处理操作,可以办好预处理指令
预处理的内容和意义
意义:使编译器实现功能变得更为专一。
内容:文件包含、宏定义、条件编译、一些特殊的预处理关键字、去掉程序中的注释
#ifdef和#if defined的区别
#if defined可以组成复杂的预编译条件,例:
#if defined(A) && defined (B)
#endif
静态库和动态库比较
使用静态库,在被链接形成可执行程序时,把库中的代码复制进可执行程序中。这样如果多个应用程序都用到相同的库函数,就会复制多分,运行时在内存中也存在多分相同的库函数副本,浪费内存。
使用动态库,在编译的时候不会复制库函数代码,只是做一个链接标记,标记这个函数需要到动态库中找,然后运行时环境发现它调用了一个动态库中的库函数,就加载这个动态库到内存,以后不管多少应用程序使用该库函数,该库函数在内存中只有一份。
制作使用静态库
gcc XX.c -o XX.o -c
ar -rc libXX.a XX.o
使用gcc -c只编译不连接,生成.o ,然后用ar工具打包成.a。库文件名不能随便起,要lib+库名称.a。
要使用的时候,把库文件拷贝到系统库目录下或者编译参数加-L指定库文件查找目录,然后编译参数加上:-lXX指定编译的时候需要用的库。
(不要忘了头文件)
制作使用动态库
gcc XX.c -o XX.o -c -fPIC
gcc -o libXX.so XX.o -shared
-fPIC是位置无关码,-shared是按照共享库的方式来链接。
使用方法和静态库一样。