【Linux】动静态库的制作与使用

这篇具有很好参考价值的文章主要介绍了【Linux】动静态库的制作与使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.静态库的制作

静态库的名称格式为:libxxx.a  

注意 xxx 才是静态库的真正名字

lib=libprint.a   //静态库的名称

$(lib):print.o  //生成静态库 (依赖 .o 文件)
	ar -rc $@ $^   //使用 ar 命令 -rc 选项生成静态库

print.o:print.c   //g++ -c 选项生成 .o 文件
	g++ -c $^ 

.PHONY:clean
clean:
	rm -rf *.a *.o

output:
	mkdir -p Lib/include
	mkdir -p Lib/mylib
	cp *.h Lib/include
	cp *.a Lib/mylib
	

二.动态库的制作

动态库的名称格式为:libxxx.so  

注意 xxx 才是动态库的真正名字

注意动态库中生成 .o 文件时gcc 要带选项 -fPIC ,表示生成位置无关码

dy-lib=liblog.so   //动态库名称


$(dy-lib):log.o   //生成动态库 (依赖 .o 文件)
	g++ -shared -o $@ $^   //g++ -shared 选项

log.o:log.c   //生成 .o 文件
	g++ -fPIC -c $^   //注意这里要带个 -fPIC 选项

.PHONY:clean
clean:
	rm -rf *.o *.so

output:
	mkdir -p Lib/include
	mkdir -p Lib/mylib
	cp *.h Lib/include
	cp *.so Lib/mylib

三.动静态库混合制作

static-lib=libprint.a
dy-lib=liblog.so

.PHONY:all   //生成多个目标文件时,可以定义一个伪目标
all: $(static-lib)  $(dy-lib)

$(static-lib):print.o
	ar -rc $@ $^

print.o:print.c
	g++ -c $^

$(dy-lib):log.o
	g++ -shared -o $@ $^

log.o:log.c
	g++ -fPIC -c $^

.PHONY:clean
clean:
	rm -rf *.a *.o *.so

output:
	mkdir -p Lib/include
	mkdir -p Lib/mylib
	cp *.h Lib/include
	cp *.a Lib/mylib
	cp *.so Lib/mylib

注意:不论是静态库还是动态库,都不可以有 main 函数 。


四.动静态库的使用

我们先在 main.cpp 文件中使用一下静态库

#include "print.h"  //静态库中的头文件

int main()
{
    print_func();  //静态库中定义的方法

    return 0;
}

g++ main.cpp 编译这个文件,出现了这样的结果:

【Linux】动静态库的制作与使用,Linux,linux,运维,服务器,动态库,静态库

 很显然是找不到头文件,可是我们不是包含了头文件吗,怎么会找不到呢?

其实 gcc 默认是在系统路径下查找的,而我们包含的头文件并不在系统路径中,如何解决?

-I (大写的 I):可以让 gcc 在指定路径下查找

那我们就 g++ main.cpp -I Lib/include  (因为我们代码中包含了头文件,所以不需要加头文件名称)

【Linux】动静态库的制作与使用,Linux,linux,运维,服务器,动态库,静态库

可以发现还是找不到,因为我们只提供了头文件的路径,gcc 还找不到库文件在哪儿

-L:可以让 gcc 在指定路径下寻找库文件 

继续 g++ main.cpp -I Lib/include -L Lib/mylib

【Linux】动静态库的制作与使用,Linux,linux,运维,服务器,动态库,静态库

还是找不到,因为一个库文件目录中可能有多个库文件,我们必须要指定库文件的名字

-l(小写的l)+静态库名称(注意之间没有空格)

继续  g++ main.cpp -I Lib/include -L Lib/mylib -lprint

【Linux】动静态库的制作与使用,Linux,linux,运维,服务器,动态库,静态库

可以发现,这次编译通过,生成了可执行文件。

如果有多个库文件,写 多个 -l(小写的l)后面跟库文件的名字就行了。

可是这也太麻烦了吧,每次编译都要写这么一长串?不可以像库函数那样,只包个头文件就行了?

下面介绍四种方法解决这个问题


五.解决找不到动态库的四种方法

1.拷贝到系统默认的库路径

  • 头文件拷贝到: /usr/include
  • 库文件拷贝到:/lib64

其实这个就是我们常说的安装。

下面演示:

拷贝

【Linux】动静态库的制作与使用,Linux,linux,运维,服务器,动态库,静态库

验证是否拷贝成功

【Linux】动静态库的制作与使用,Linux,linux,运维,服务器,动态库,静态库

之后,g++ main.cpp -lprint (注意要带库文件名) 编译文件

【Linux】动静态库的制作与使用,Linux,linux,运维,服务器,动态库,静态库

2.在系统默认的库路径下建立软链接

  •  头文件:/usr/include 下建立软链接

  • 库文件:/lib64 下建立软链接

建立软链接:

【Linux】动静态库的制作与使用,Linux,linux,运维,服务器,动态库,静态库

为头文件的目录建立软链接,因为一个目录里可能有很多头文件。

验证是否建立成功:

【Linux】动静态库的制作与使用,Linux,linux,运维,服务器,动态库,静态库 现在只需要在main.cpp文件中这么包含头文件就行了

【Linux】动静态库的制作与使用,Linux,linux,运维,服务器,动态库,静态库

之后,g++ main.cpp -lprint (注意要带库文件名) 编译文件

【Linux】动静态库的制作与使用,Linux,linux,运维,服务器,动态库,静态库

3.将自己的库所在的路径,添加到系统的环境变量LD_LIBRARY_PATH中

LD_LIBRARY_PATH 是系统提供用户层的搜索路径,一般情况下,你的电脑上可能没有设置,如果你配置过vim,那么会有如下信息:

【Linux】动静态库的制作与使用,Linux,linux,运维,服务器,动态库,静态库

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:(库文件的路径)

4./etc/ld.so.conf.d建立自己的动态库路径的配置文件,然后重新ldconfig即可

最好切成root用户,然后进入 /etc/ld.so.conf.d 目录

cd /etc/ld.so.conf.d

【Linux】动静态库的制作与使用,Linux,linux,运维,服务器,动态库,静态库

这个目录下都是些 .conf 结尾的配置文件,这些文件里的内容都是路径。

【Linux】动静态库的制作与使用,Linux,linux,运维,服务器,动态库,静态库 【Linux】动静态库的制作与使用,Linux,linux,运维,服务器,动态库,静态库

我们只需要建立一个 .conf 文件,然后把对应动态库的路径放到这个文件里

然后 ldconfig 把所有的配置文件重新加载一下

ldconfig

介绍了这么多方法,其实最常用的还是第一种,即我们常说的安装。

这里提一个比较好玩的库 :ncurse 库,用这个库可以做出很多好玩的东西。

想了解的话,可以自行搜索。


🐬🤖本篇文章到此就结束了, 若有错误或是建议的话,欢迎小伙伴们指出;🕊️👻

😄😆希望小伙伴们能支持支持博主啊,你们的支持对我很重要哦;🥰🤩

😍😁谢谢你的阅读。😸😼文章来源地址https://www.toymoban.com/news/detail-766133.html

到了这里,关于【Linux】动静态库的制作与使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】详解动静态库的制作和使用&&动静态库在系统中的配置步骤

    1、提高开发效率,让开发者所有的函数实现不用从零开始。 2、隐藏源代码。          库其实就是所有的.o文件用特定的方式进行打包形成一个文件,各个.o文件包含了源代码中的机器语言指令。 先将我们的.c文件或者是.cpp文件形成.o文件,指令为: gcc/g++ -c 要形成的.o文

    2024年04月17日
    浏览(48)
  • 【Linux从入门到精通】动静态库的原理与制作详解

         本篇文章主要是 围绕动静态库的原理与制作进行展开讲解 的。其中涉及到了 inode的概念引入和软硬连接 的讲解。会结合实际操作对这些抽象的概念进行解释,希望会对你有所帮助。 文章目录 一、inode 概念 二、软硬链接 2、1 软连接 2、2 硬链接 三、动静态库概念 3、

    2024年02月12日
    浏览(39)
  • 【linux深入剖析】动态库的使用(续) | 动静态库的链接

    🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 回顾上节,我们在创建了动态库libmymath.so 我们使用指令 gcc main.c -L. -lmymath -L . (-L + 路径表示myc这个库在哪

    2024年04月15日
    浏览(40)
  • Linux中静态库和动态库的使用

    介绍: 库是一个二进制文件,包含的代码可被程序调用 标准C库、数学库、线程库… 库有源码,可下载后编译;也可以直接安装二进制包 位置一般放在:/lib /usr/lib 库的知识 库是事先编译好的,可以复用的代码 在os上运行的程序基本上都要使用库,使用库可以提高开发效率

    2024年01月25日
    浏览(38)
  • 【Linux】Linux编译器 gcc 的使用 | 动静态库的初步认识

    👑作者主页:@安 度 因 🏠学习社区:StackFrame 📖专栏链接:Linux

    2024年01月15日
    浏览(38)
  • 【Linux】动静态库的使用与软链接的结合

    库本质就是把一堆(.o)后缀的文件也就是目标文件整合在一起 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库 在makefile中 1.第三方库的使用,gcc往后必须加上 -l +库名 2.如果系统中只提供静态链接,则gcc对其进行静态链

    2024年02月05日
    浏览(39)
  • 详解Linux下静态库/动态库的生成和使用(含代码示例和操作流程)&&动态库和静态库的区别

    关于gcc的使用方法可以参考下方链接博客: Linux下详解gcc编译过程(含代码示例) gcc使用教程 库是一种组件技术。 库里封装了数据和函数,提供给用户程序调用。 库只执行到第三阶段编译,没有链接。 库的使用可以使程序模块化,提高程序的编译速度,实现代码复用。

    2024年02月15日
    浏览(45)
  • 运维 | 查看 Linux 服务器 IP 地址

    大多数在操作 Linux 系统时,我们经常需要知道服务器的 IP 比便于后续的一系列操作,这时候有快速查看主机 IP 的命令行操作,能够有效的帮助我们 本章节主要记录一些常用查看服务器 IP 的命令,希望对大家有所帮助。 查看 Linux 服务器的 IP 地址的命令大体上有以下几种。

    2024年04月27日
    浏览(81)
  • 动静态库的理解、制作、使用。

    1.什么是库? 代码是无穷无尽的,当程序猿在写一些项目时,未必所有代码亲历亲为,他们可以在网上寻找大佬写过的一些有关需求的代码,这些代码可以让他们拿过来直接使用,而省去了许多精力。 把一些 代码进行打包 ,形成的便是库了。   上面所说,库就是将代码进行

    2024年01月24日
    浏览(48)
  • linux 系统中vi 编辑器和库的制作和使用

    目录 1 vim 1.1 vim简单介绍 1.2 vim的三种模式 1.3 vim基本操作 1.3.1命令模式下的操作 1.3.2 切换到文本输入模式 1.3.3 末行模式下的操作 2 gcc编译器 2.1 gcc的工作流程 2.2 gcc常用参数 3 静态库和共享(动态)库 3.1库的介绍    3.2静态库(static library) 3.3共享库(shared library)/动态库

    2024年02月12日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包