1、头文件
C/C++中可以通过#include <stdio.h>和#include "stdio.h"包含头文件,区别是:
#include <stdio.h>,直接到系统指定目录去查找头文件;
#include “stidio.h”,会先到当前工程目录查找头文件,如果没找到再到系统指定目录查找。
gcc编译时查找头文件,按照以下路径顺序查找:
1、 搜寻会从-I开始,比如:
gcc -I /usr/local/include/node a.c
2、 然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH
3、 再找系统默认的路径
/usr/include
/usr/local/include
/usr/lib/gcc-lib/i386-linux/2.95.2/include
2、库文件
编译的时候:
1、 gcc会去找-L
2、 再找gcc的环境变量LIBRARY_PATH
3、 配置文件中的指定/etc/ld.so.conf
4、 再找内定目录
/lib:
/usr/lib:
/usr/local/lib:
3、头文件和库文件
头文件是文本文件,是可供阅读的;库文件是二进制文件,不可直接阅读。库文件是将一系列的源文件进行编译打包,形成的二进制文件包,其中封装着函数接口,在编程中可以由其它源文件调用。 头文件在编译中使用;库文件在链接中使用。头文件中是函数或定义的声明,及少量内联函数的使用,一般不包含非静态函数实现;库文件中包含函数的实现。头文件是手动编写的,库文件是编译生成的。 虽然没有规定调用库函数必须引用头文件,但一般约定,当调用库函数的时候需要引用接口函数所在的头文件。 一个库文件均有一组头文件与其对应。库文件和对应头文件的作者应为同一个。作者必须保证头文件中所声明的函数类型及参数列表,与库文件中的实现是相同的。具体来说,头文件中有函数的申明,库文件实现函数的定义。比如,printf函数。使用时应包括stdio.h,打开stdio.h你只能看到,printf这个函数的申明,却看不到printf具体是怎么实现的,而函数的实现在相应的C库中。而库文件一般是以二进制形式而不是C源文件形式提供给用户使用的。程序中包括了stdio.h这个头文件。链接器就能根据头件中的信息找到printf这个函数的实现并链接进这个程序代码段里。总结起来就是,库文件通过头文件向外导出接口。用户通过头文件找到库文件中函数实现的代码从而把这段代码链接到用户程序中去。
3.1 头文件一般在源文件中用#include命令包含,头文件如果放在/usr/include目录下则会自动找到不会报错,否则编译链接时需要使用 -I 所在目录才能正确找到。头文件不需要具体指定是哪个头文件,因为在源代码文件中#include已经有说明,因此只需要-I参数指明目录即可,但是库文件需要-l参数指定是哪个库文件
3.2 库文件即库函数,如printf和scanf函数。以libgtdf.so库文件为例(库文件在命名时都以lib开头,因此使用-l选项去链接指定的库文件时可以省略lib三个字母,即-lgtdf),一般库文件如果是放在/lib,/usr/lib,/usr/local/lib目录(库文件的默认目录)下,则无需额外处理,编译链接时-lgtdf会自动找到对应文件不会报错,但是如果不在对应目录,则需要加上-L 所在目录 -lgtdf才能找到对应的库文件。
Linux下的库文件分为两大类,分别为动态链接库(.so)和静态链接库(.a),两者的差别仅在于程序执行时所需要的代码是在运行时动态加载的,还是编译时静态加载的。
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。编译之后程序文件大,但加载快,隔离性也好。 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。多个应用程序可以使用同一个动态库,启动多个应用程序的时候,只需要将动态库加载到内存一次即可。
4、运行时动态库的搜索路径
1、 在编译目标代码时指定该程序的动态库搜索路径,还可以在编译目标代码时指定程序的动态库搜索路径。这是通过gcc 的参数"-Wl,-rpath,"
指定。当指定多个动态库搜索路径时,路径之间用冒号":“分隔。
2、 通过环境变量LD_LIBRARY_PATH
指定动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号”:"分隔)。
3、 在配置文件/etc/ld.so.conf中指定动态库搜索路径,该文件中每行为一个动态库搜索路径。每次编辑完该文件后,都必须运行命令ldconfig使修改后的配置生效。
4、 默认的动态库搜索路径
/lib
/usr/lib
附:/lib、 /usr/lib和 /usr/local/lib区别
usr 很多人都认为是user缩写,其实不然,是unix system resource缩写。
/lib是内核级的,
/usr/lib是系统级的,
/usr/local/lib是用户级的。
/lib/ — 包含许多被 /bin/ 和 /sbin/ 中的程序使用的库文件。
目录 /usr/lib/ 中含有更多用于用户程序的库文件。
/usr/bin:几乎所有的系统可执行文件都会安装在这里
/usr/local/bin:则是可以存放一些系统用户自己特定的可执行文件,不用担心会被系统升级之类的行为覆盖,破坏,这个目录不是必须的