头文件与库文件的区别
一、头文件与库文件的区别
- 头文件一般而言,是申明和定义。
- 库文件是已经编译好的二进制代码。这个二进制代码可以是动态的,如 .so ;也可以是静态的,如 .a 。如果是动态的,则最后生成的程序文件在运行时,需要这个动态库的支持;如果是静态的,则最后生成的可执行程序文件运行时可以脱离这个库文件而独立运行。
头文件以.h结尾,可以用文本编辑器查看内容。是ASCII的。
而库文件以.a(静态库)或.so(动态库)结尾,是二进制的。
二、从几个常遇到的问题谈起
问题一:undefined reference to 'xxx'.
问题二:/usr/bin/ld:cannot find -lxxx.
问题三:xxx.h:No such file or directory.
首先,这几个问题都不是编译错误,是链接错误,也就是如果出现的是这几个错误,说明你的源程序本身没有问题,是你的编译选项用的不对或者缺少相关的库文件或者头文件。前两个问题是找不到库文件的问题,后一个问题是找不到头文件的问题。下面详细说一下头文件和库文件相关的问题。
三、库文件相关(-l选项和-L选项(大小写L))
编译完成之后就进入链接阶段,这里就涉及到函数库,比如通常的用的 printf 函数,我们仅仅在程序开始包含进了“stdio.h”,这个里面也只有该函数的声明,而没有定义函数的实现,那么,printf函数的实现在哪里呢?答案是在函数库中,链接时,gcc会链接到具体的函数库中,在那里可以找到printf函数的实现。
-l 参数就是用来指定程序要链接的库,-l 参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是 m ,他的库文件名是 libm.so,很容易看出,把库文件名的头 lib 和尾 .so 去掉就是库名了。
好了现在我们知道怎么得到库名了,比如我们自已要用到一个第三方提供的库名字叫libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件)。
放在 /lib 和 /usr/lib 和 /usr/local/lib 里的库可直接用 -l 参数就能链接了。但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用 -l 参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld:cannot find -lxxx”,也就是链接程序 ld 在那3个目录里找不到 libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它放在/usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是-L/aaa/bbb/ccc -ltest。
四、头文件相关(-I选项(大写i))
-I 参数是用来指定头文件目录,/usr/include 目录一般是不用指定的,gcc知道去那里找,但是如果头文件不在 /usr/include 里我们就要用 -I 参数指定了,比如头文件放在 /myinclude 目录里,那编译命令行就要加上-I/myinclude参数了,如果不加你会得到一个"xxxx.h: No such file or directory"的错误。-I 参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定。
头文件与库文件的区别相关推荐
- 头文件和库文件的区别
头文件中有函数的申明,库文件实现函数的定义. 比如,printf函数.使用时应包括stdio.h,打开stdio.h你只能看到,printf这 个函数的申明,却看不到printf具体是怎么实现的,而函 ...
- .h头文件 .lib库文件 .dll动态链接库文件关系
.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的. 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和lib就够 ...
- .h头文件 .lib库文件 .dll动态库文件之间的关系
.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的. 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和li ...
- Linux找头文件规则,linux 头文件、库文件查找顺序
linux 头文件.库文件查找顺序 默认分类 2009-11-14 01:24:28 阅读126 评论0 字号:大中小 linux 头文件.库文件查找顺序 2009-11-03 12:36 Inclu ...
- linux+C环境下动态管理头文件和库文件
本文共分三个部分:首先给出了一个简单的Makefile的例子,然后分别详细阐述了头文件和库文件的相关知识 1.一个Makefile的例: -L是指定链接时搜索路径,比如-L./等: -l是指定具体的库 ...
- Linux下gcc编译中关于头文件与库文件搜索路径相关问题
如何指定GCC的默认头文件路径 网上偶搜得之,以之为宝:) 原地址:http://blog.chinaunix.net/u/28781/showart.php?id=401631 ========== ...
- C程序背后的故事--头文件、库文件的查找
文章目录 1 C程序中头文件.库文件的查找 1.1 头文件有什么用 1.2 C文件有什么用 1.3 头文件在哪里 1.4 printf函数在哪里 1.5 如何指定自己的库 1 C程序中头文件.库文件的 ...
- C语言的头文件和库文件(函数库)
C语言的头文件和库文件(函数库) 分类: Unix环境高级编程 2011-04-17 14:37 2576人阅读 评论(1) 收藏 举报 语言cgcclinuxunix 在C语言中,头文件提供对常量的 ...
- linux应用开发:头文件和库文件的路径及使用
1. 头文件 1)系统标准头文件位置: /usr/include下,以及安装库的头文件位置:/usr/local/include/ 如 #include<linux/can.h> 对应 / ...
最新文章
- 理解NSAttributedString
- java中que_重写java Eques()方法-不工作吗?
- 7.多媒体☞图像图形拍照
- 4条实用小建议,送给初入NLP领域的你
- linux驱动导出文件属性,将Linux配置文件和设置备份到USB闪存驱动器的方法
- IOS之使用纯代码push ViewController
- django-orm框架了解
- 带你了解Typescript的14个基础语法
- 【Level 08】U06 Good Feeling L1 End-of-season game
- 人脸识别时一定要穿衣服!小心被看光光......
- 2020年12月程序员工资统计,平均14222元,Java排名靠后!
- 2005年1月-2008年10月雅思A类(学术类)作文 TASK 2 考题汇总(10月4日更新)
- VS2010 error RC2135: file not found
- 分布式系统到底是什么
- Vue验证座机号的同时验证手机号
- 怎么设置浏览器默认搜索引擎,设置默认搜索引擎的方法步骤
- 机器学习笔记 - 什么是高斯混合模型(GMM)?
- “Xilinx ZYNQ+TCP通信+Python上位机”实现实时视频传输系统
- C语言求解三个数的中间值
- (Java实现) N皇后问题