news 2026/8/22 11:11:41

C语言链接库

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言链接库

1.库的定义

当使用别人的函数时除了包含头文件以外还要有库

Linux系统存储库的位置一般在/lib或/usr/lib

库文件:通俗讲将用户写好的程序打包形成一个整体;当其他用户或其他模块使用时,只要有这个库文件就可以,不需要源代码。也可以理解为一组预先编译好的方法集合。

本质上来说库就是一种可执行的二进制形式

由于Windows和Linux的本质不同,因此二者库的二进制是不兼容的

Linux:.so .a Windows:.dll

lib:库文件

include:头文件

2.库的分类

动态库、静态库,本质区别是代码载入时刻不同

2.1静态库

静态库是在程序编译时会被复制到目标代码中,以.a结尾

优点:程序运行时将不再需要该静态库;运行时无需加载库,运行速度更快

缺点:静态库中的代码复制到了程序中,因此体积较大;静态库升级后,程序需要重新编译链接

2.2动态库

动态库是在程序运行时才会被载入到代码中。也叫共享库,以.so结尾

优点:程序在执行时加载动态库,代码体积小;程序升级更简单;

不同应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实列。

缺点:运行时还需要动态库的存在,移植性较差

3.库的制作

3.1静态库的制作

1-将原文件编译成目标文件

gcc -c xx.c -o xx.o

2-创建静态库用ar命令,它将很多.o文件转换成.a

ar crs libxxx.a xxx.o xxx.o ....

静态库文件名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a

3-测试使用静态库

gcc xx.c -L. -l库名 //-L指定库的路径 -l指定库名

3.2动态库的制作

1.我们用gcc来创建共享库

gcc -fPIC -c xx.c -o xx.o

-fPIC 创建与地址无关的编译程序

gcc -shared -o libxxx.so xx.o xx.o ....

2.测试使用动态库:

gcc xx.c -L. -l指定库名

可以正常编译通过,但是运行时报错./a.out: error while loading shared libraries: libmyadd.so: cannot open shared object file: No such file or directory

原因:当加载动态库时,系统会默认从/lib或/usr/lib路径下查找库文件,所以不用加-L指定路径了,直接gcc main.c -lmydynamic就可以了。

解决方法

1)把库拷贝到/usr/lib和/lib目录下。(此方法编译时不需要指定库的路径)

补充:

-L路径:指定库的路径

-l库名:指定链接的库名

-I(大写i)路径:指定头文件的路径 默认查找的路径/usr/include

<>代表从系统路径下查找

“”代表从当前路径下查找如果没有再去系统路径下查找

ldd 可执行文件名:查看链接的动态库

补充:

同名的静态库和动态库:默认优先使用动态库,如果想使用静态库,需要在后面加-static,这是内核规定的。

如果链接没有lib前缀库文件,可以直接使用-指定的全名无需加载选项。

3.3总结静态库和动态库

静态库:编译阶段,以.a结尾,执行速度快,体积大,移植性好,升级麻烦。

动态库:运行阶段,以.so结尾,执行速度慢,体积小,移植性差,升级简单。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/22 11:10:28

C++左值与右值深度解析:从内存模型到移动语义实战

1. 从一次“诡异”的赋值错误说起几年前&#xff0c;我在调试一个性能要求极高的C数据处理模块时&#xff0c;遇到了一个让我百思不得其解的问题。代码逻辑看起来毫无破绽&#xff0c;但在一个看似简单的赋值操作后&#xff0c;程序的行为变得飘忽不定&#xff0c;时而正常&…

作者头像 李华
网站建设 2026/8/22 11:10:14

ESGUI V2.0.0:Python脚本快速打包成独立GUI应用与分发指南

1. 先搞清楚 ESGUI V2.0.0 到底解决了什么问题如果你在找一款能快速把 Python 脚本或算法包装成图形界面的工具&#xff0c;ESGUI 的 V2.0.0 版本值得你花时间了解一下。这个版本的核心不是增加花哨的功能&#xff0c;而是解决了一个很实际的问题&#xff1a;让一个原本只能命令…

作者头像 李华
网站建设 2026/8/22 11:10:10

免费装好 Plus Jakarta Sans 开源字体:4 步走完最短上手路径

免费装好 Plus Jakarta Sans 开源字体&#xff1a;4 步走完最短上手路径 【免费下载链接】PlusJakartaSans Jakarta Sans is a open-source fonts. Designed for Jakarta "City of collaboration" program in 2020. 项目地址: https://gitcode.com/gh_mirrors/pl/P…

作者头像 李华
网站建设 2026/8/22 11:10:02

C++模板编程:从泛型思想到实战应用全解析

1. 项目概述&#xff1a;为什么C模板是绕不开的硬骨头但凡写过一段时间C&#xff0c;尤其是接触过标准库或者一些开源框架&#xff0c;你一定会对vector<int>、map<string, MyClass>这类写法感到既熟悉又困惑。熟悉是因为天天用&#xff0c;困惑是当你想自己写一个…

作者头像 李华
网站建设 2026/8/22 11:08:32

GitHub开源工具箱:从选型到实战,打造高效开发运维利器

在实际开发、运维、学习过程中&#xff0c;我们经常需要处理各种琐碎但必要的工作&#xff1a;查看系统信息、测试网络、转换格式、下载文件、管理进程、分析日志。如果每个任务都去寻找一个独立的工具&#xff0c;不仅效率低下&#xff0c;也容易让工作流变得碎片化。一个集成…

作者头像 李华
网站建设 2026/8/22 11:08:06

OpenRouter集成Stripe支付:一站式LLM API聚合平台实战指南

这次我们来看一个对开发者来说很实用的工具更新&#xff1a;OpenRouter 正式集成了 Stripe 支付。这看起来只是一个支付方式的增加&#xff0c;但背后直接关系到我们调用多模型 API 的成本、效率和便捷性。对于经常需要对比不同大模型效果&#xff0c;或者想用一个接口统一调用…

作者头像 李华