《嵌入式LINUX与物联网软件开发 C语言内核深度解析》学习5——预处理、函数库

C编译连接流程

《嵌入式LINUX与物联网软件开发 C语言内核深度解析》学习5——预处理、函数库_第1张图片

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是按照共享库的方式来链接。
使用方法和静态库一样。

你可能感兴趣的:(C语言学习)