在linux中库与头文件有什么联系

发布时间 - 2023-03-16 00:00:00    点击率:
在linux中库与头文件的联系:头文件中有函数的申明,库文件实现函数的定义;库中的每个函数都需要在头文件中加以声明。在写程序时,需要用头文件来提供对常量的定义和对系统函数及库函数调用的声明;而库是一组已经编译好的函数的集合,也就是目标文件“.o”的集合,是按照可重用的原则编写的,一般由一组互关联的函数组成以执行某项常见任务。

本教程操作环境:linux7.3系统、Dell G3电脑。

在一般应用程序源代码中,头文件中有函数的申明,库文件实现函数的定义;库中的每个函数都需要在头文件中加以声明。

1. 头文件

在写程序时,我们需要用头文件来提供对常量的定义和对系统函数及库函数调用的声明,这些头文件位于/usr/include中。这些头文件都位于可以被编译器自动搜索到的目录中,如X视窗系统的/usr/include/X11和GNU C++的/usr/include /c++。

在调用gcc时,可以使用标志-I来包含保存在子目录或其它非标准位置中的头文件,例如 gcc -I/usr/openwin/include fred.c

2. 库文件

库是一组已经编译好的函数的集合,也就是目标文件.o的集合,是按照可重用的原则编写的,一般由一组互关联的函数组成以执行某项常见任务。

标准linux系统库文件一般存储在/lib/usr/lib目录中。默认情况下GCC的链接程序只搜索标准C语言库,这是一个历史遗留问题。我们必须使库文件名遵守特定的规范并在命令行中加以指定。

库文件总以lib开头,然后指出这是什么库,最后的部分.a代表静态函数库,.so代表共享函数库(即windows下的DLL动态链接库)。

gcc -o fred fred.c /usr/lib/libm.agcc -o fred fred.c -lm
-L标志为链接器增加库的搜索路径,如gcc -o x11fred -L /usr/openwin/lib x11fred.c -1X11

2.1 静态库

静态库以.a结尾,也称作归档文件,在生成可执行程序时,静态库文件就被链接进去,生成的可执行文件较大,可以脱离静态库文件运行。

2.1.1 生成方法

首先创建两个源文件fred.c和bill.c

然后用gcc -c编译生成两个目标文件

然后为这两个函数编写头文件,进行函数声明

然后在main函数中包含头文件并调用其中一个库函数

然后编译main函数并将main.o和之前生成的bill.o链接,可以正确执行

接下来我们生成库文件,用ar归档程序创建归档文件并将目标文件添加进去,它可将若干单独的文件归并到一个大的文件中。ar crv libfoo.a bill.o fred.o 之后我们要用ranlib命令为函数库生成一个内容表。

然后我们将库文件和之前生成的program.o文件链接起来,执行成功

也可以用-l指定函数库,并用-L指定非标准位置。

我们可以用nm命令查看哪些函数被包含在目标文件,函数库或可执行文件中,可用于反汇编分析。程序被创建时它只包含函数库中它所实际需要的函数,虽然头文件中有所有函数的声明,但链接器并不会将它们全部链接进去。

静态库Linux与Windows的比较

2.2 共享库

当同时运行许多应用程序并且他们中都使用来自同一个函数库的函数时,内存中会有同一个函数的许多副本,浪费内存和外存!!当程序使用函数库时,它本身在链接时不再包含函数代码,而是引用运行时可访问的共享代码,当编译好的程序被装载到内存中执行时,函数引用被解析并产生对共享库的调用,如果有必要,共享库才被加载到内存中。即系统可以只在内存中保留共享库的一份副本供许多应用程序调用,在外存上也可只保留一份。而且共享库的更新也可以独立于依赖它的应用程序,应用程序不需再重新编译。
在linux系统中,负责装载共享库并解析客户程序引用的函数的程序(动态装载器)是ld.so

2.2.1 生成方法

用中间文件bill.o fred.o生成共享库libfoo.so gcc -shared -fpic -o libfoo.so bill.o fred.o

生成了共享库后,要置于标准搜索目录下。搜索共享库的额外位置可以在文件/etc/ld.so.conf中配置,修改这个文件后执行命令ldconfig来处理。
/etc/ld.so.conf的内容为include /etc/ld.so.conf.d/*.conf,在此目录下建立自己的动态链接库路径配置文件mylib.conf

然后指定搜索路径

链接生成可执行文件gcc -o main program.o -lfoo -L.

ldd工具可用来分析可执行文件运行所需要的共享库

也可以在编译目标代码时指定.so库的搜索路径,通过gcc 的参数-Wl,-rpath指定,如gcc main.cpp -lfoo -L. -Wl,-rpath=.-Wl, 表示后面的参数将传给 link 程序 ld (因为 gcc 会自动调用ld )当指定多个动态库搜索路径时,路径之间用冒号 " : " 分隔。

相关推荐:《Linux视频教程》


# linux  # 头文件  # 应用程序  # 中有  # 可执行文件  # 库中  # 可以用  # 并将  # 需要用  # 自己的  # 某项 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 教你用AI润色文章,让你的文字表达更专业  linux写shell需要注意的问题(必看)  如何在香港服务器上快速搭建免备案网站?  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  高端网站建设与定制开发一站式解决方案 中企动力  Laravel如何为API编写文档_Laravel API文档生成与维护方法  如何快速完成中国万网建站详细流程?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  EditPlus中的正则表达式 实战(2)  Laravel如何自定义分页视图?(Pagination示例)  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  Laravel如何实现多对多模型关联?(Eloquent教程)  Laravel如何实现用户密码重置功能?(完整流程代码)  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  如何在 React 中条件性地遍历数组并渲染元素  Python3.6正式版新特性预览  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  Python函数文档自动校验_规范解析【教程】  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  Swift中swift中的switch 语句  JS实现鼠标移上去显示图片或微信二维码  php结合redis实现高并发下的抢购、秒杀功能的实例  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  Laravel如何实现一对一模型关联?(Eloquent示例)  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  jQuery 常见小例汇总  如何快速搭建高效WAP手机网站?  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  网站制作企业,网站的banner和导航栏是指什么?  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  简单实现Android验证码  Laravel如何配置Horizon来管理队列?(安装和使用)  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  高端云建站费用究竟需要多少预算?  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  JavaScript如何实现倒计时_时间函数如何精确控制  如何获取上海专业网站定制建站电话?  Android自定义控件实现温度旋转按钮效果  高性能网站服务器配置指南:安全稳定与高效建站核心方案  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  如何将凡科建站内容保存为本地文件?  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  香港服务器部署网站为何提示未备案?  linux top下的 minerd 木马清除方法