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

2019-07-12 18:38发布

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