头文件和库文件

简单的说:头文件提供声明,库文件提供定义/实现。
C 代码的编译过程: 预处理(需要头文件) -> 编译 -> 汇编 -> 链接(需要库文件); 执行时可能还有动态链接过程。

在早期的编程语言中Basic Fortan没有头文件的概念,c++/c语言的初学者虽然会使用头文件,但是常常不明其理。

   1、通过头文件来调用库功能。 在很多场合,源代码不便(或不准)向用户公布, 只要向用户提供头文件和二进制的库即可,用户只需要按照头文件中的接口声明来调用库函数, 而不必关心接口是怎么实现的,编译器会从库中提取相应的代码;

  2、头文件能加强类型安全检查, 某个 接口被实现或被使用时的方式如果与头文件的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担;

  3、头文件可以提高程序的可读性;

 

Include的header文件,动态链接库,系统定义,总共有下列来源指定gcc去那里找。

 

当初在编译时指定的(在~gcc/gcc/collect2.c:locatelib()

 

写在specs内的 ,内定的,这是当初compile gcc时写在程序内的。

 

后来用-D -I -L指定的

 

gcc环境变量设定(编译的时候)

 

ld.so的环境变量(这是run time的时候)

 

 

 

一、头文件

 

gcc 在编译时如何去寻找所需要的头文件:

 

※所以header file的搜寻会从-I开始

 

※然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH

 

※再找内定目录

 

/usr/include

 

/usr/local/include

 

/usr/lib/gcc-lib/i386-linux/2.95.2/include

 

/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3

 

/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include

 

 

 

库文件,但是如果装gcc的时候,是有给定的prefix的话,那么就是

 

/usr/include

 

prefix/include

 

prefix/xxx-xxx-xxx-gnulibc/include

 

prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include

 

 

 

二、库文件

 

cos()等函式库的选项要多加 -lm

 

编译的时候:

 

※gcc会去找-L

 

※再找gcc的环境变量LIBRARY_PATH

 

※再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的

 

 

 

三、运行时动态库的搜索路径

 

1、在配置文件/etc/ld.so.conf中指定动态库搜索路径

 

2、通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔)

 

3、在编译目标代码时指定该程序的动态库搜索路径(还可以在编译目标代码时指定程序的动态库搜索路径。

 

这是通过gcc 的参数"-Wl,-rpath,"指定(如例3所示)。当指定多个动态库搜索路径时,路径之间用冒号":"分隔)

 

4、默认的动态库搜索路径/lib

 

5、默认的动态库搜索路径/usr/lib

 

可以通过执行可执行文件pos得到的结果不同获知其搜索到了哪个动态库,从而获得第1个动态库搜索顺序,然后删除该动态库,

 

再执行程序pos,获得第2个动态库搜索路径,再删除第2个被搜索到的动态库,

 

如此往复,将可得到Linux搜索动态库的先后顺序。

 

程序pos执行的输出结果和搜索到的动态库的对应关系如表1所示

 

程序pos输出结果 使用的动态库 对应的动态库搜索路径指定方式

 

./ ./libpos.so 编译目标代码时指定的动态库搜索路径

 

/root/test/env/lib /root/test/env/lib/libpos.so 环境变量LD_LIBRARY_PATH指定的动态库搜索路径

 

/root/test/conf/lib /root/test/conf/lib/libpos.so 配置文件/etc/ld.so.conf中指定的动态库搜索路径

 

/lib /lib/libpos.so 默认的动态库搜索路径/lib

 

/usr/lib /usr/lib/libpos.so 默认的动态库搜索路径/usr/lib

 

综合以上结果可知,动态库的搜索路径搜索的先后顺序是:

 

1.编译目标代码时指定的动态库搜索路径;

 

2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

 

3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;

 

4.默认的动态库搜索路径/lib;

 

5.默认的动态库搜索路径/usr/lib。

 

时间: 2024-11-03 13:50:17

头文件和库文件的相关文章

linux gcc 编译时头文件和库文件搜索路径

一.头文件    gcc 在编译时寻找所需要的头文件 :    ※搜寻会从-I开始    ※然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH    ※再找内定目录   /usr/include   /usr/local/include   /usr/lib/gcc-lib/i386-linux/2.95.2/include   /usr/lib/gcc-lib/i386-linux/2.95.2/../../../..

eclipse纪录项目包括的文件和库文件的配置是放在哪里的?

问题描述 最近发现,我在workspace里删除一个项目目录,把别处更新过的该项目直接拷贝进来,打开eclipse后,会提示错误,仔细检查后,发现是因为没有包括后来加入的源文件和lib库导致的,但是这些源文件其实已经存在于对应目录下了.后来我只好使用eclipse import project才完成的,但是我还是想找到他的配置文件所在,这样我可以直接拷贝来完成 解决方案 http://stackoverflow.com/questions/2481089/where-does-eclipse-s

交叉编译-linux下gtk的库文件有很多,不知道哪一个是我用的

问题描述 linux下gtk的库文件有很多,不知道哪一个是我用的 我做的应用运行在手持终端,基于一个精简的Linux系统.用的gcc-arm-linux交叉编译工具 现在我就想搞清楚头文件和库文件在哪里,makefile脚本很复杂而且有很多文件,完全看不懂,只能凭目录名称去找...头文件在/usr/local/arm-linux/include/gtk/下库文件用locate libgtk查找有一大堆,目测有关系的有下面这些:/usr/local/arm-linux/arm-linux/lib/

visual studio-求解,vs在使用DLL,我都包含了那些需要的头文件和库目录了

问题描述 求解,vs在使用DLL,我都包含了那些需要的头文件和库目录了 就是怎么检查到动态库是否包进来了? 我出现了 error LINK2019错误,在使用DLL 的时候 解决方案 楼主还要配置过.lib的 在使用动态库的时候,往往提供两个文件:一个引入库(.lib)文件(也称"导入库文件")和一个DLL(.dll)文件.虽然引入库的后缀名也是"lib",但是,动态库的引入库文件和静态库文件有着本质的区别,对一个DLL文件来说,其引入库文件(.lib)包含该DLL

Dev c++可以用Fmod音乐引擎吗?需要什么头文件和库?怎么添加呢?

问题描述 Dev c++可以用Fmod音乐引擎吗?需要什么头文件和库?怎么添加呢? 我知道fmod用VC应该很简单,但是不会用devc++使用这个引擎,我想在控制台运行程序的时候加BGM,或者有其他的办法吗? 解决方案 http://www.zhihu.com/question/37374187

自制的一个操作sqlite数据库的库文件

 自制的一个操作sqlite数据库的库文件,写时用的IDE是KDevelop3.3.4. 头文件: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #ifndef _SQLITE3LIB_H_ #define _SQLITE3LIB_H_   #include <stdio.h> #include <stdlib.h> #include<sqlite3.

gcc-GCC编译时 链接阶段未指定正确的库文件 请大神帮忙看下

问题描述 GCC编译时 链接阶段未指定正确的库文件 请大神帮忙看下 解决方案 头文件有正确包含么?函数名拼写正确么?没找到这个函数. 解决方案二: 你的函数库文件没有link,你需要编译的时候通过-L来指定对应的lib 解决方案三: 我在做linphone 然后就出现问题了

C++的头文件和实现文件分别写什么

在C++编程过程中,随着项目的越来越大,代码也会越来越多,并且难以管理和分析.于是,在C++中就要分出了头(.h)文件和实现(.cpp)文件,并且也有了Package的概念. 对于以C起步,C#作为"母语"的我刚开始跟着导师学习C++对这方面还是感到很模糊.虽然我可以以C的知识面对C++的语法规范,用C#的思想领悟C++中类的使用.但是C#中定义和实现是都在一个文件中(其实都是在类里面),而使用C的时候也只是编程的刚刚起步,所写的程序也只要一个文件就够了.因此对于C++的Package

inifile 一个轻量级的INI文件解析库

inifile 一个轻量级的INI文件解析库 ini文件是一种常见的配置文件.它以简单的文字与简单的结构组成.INI文件会以不同的扩展名,如".ini.",".cfg",".conf"等. INI文件的格式 INI文件由3个重要的部分组成:参数(parameters),段(sections)和注释(comments).其格式如下: 段(sections) [section] 参数(parameters) name=value 注释(comment