C++的静态链接库和动态链接库

C++的静态链接库和动态链接库,第1张

   在电脑上安装某个软件的时候,我们都能看到安装目录下有很多lib和dll文件,并且我相信,你在用某个软件工具的时候遇到过以下这个界面:

这个界面提示你如案件在运行过程中少了某一个文件,导致软件无法再进行运行下去。

    再者,我们在开发过程中,工程项目的拷贝出错或者版本没对应上的问题也会导致程序运行不了。

这个时候我们只需要将对应的dll文件找到或者从新配置一下就可以了。

1. 那么问题来了,究竟什么是库文件呢?

    所谓库文件就是工程项目的扩展模块。

因为我们在开发软件的时候,不可能一下子就想到了把整个项目开发的天衣无缝,并且也不会将所有功能全部集中在一个工程中开发完成,因为这样会导致我们的工程非常臃肿。

为了解决这个问题,需要将把整个项目分成若干个功能模块,这些功能模块不在同一个项目工程中编写,而是以库的形式加载到项目中,常见的库有静态库和动态库。

    库中存放的全部都是二进制代码,正常人都是看不懂的嘿嘿嘿~~,除非你有超能力。

2. 静态库和动态库的生成和区别?

(1)静态库的命名和制作

静态库
命名规则LinuxlibServen.a (前缀lib和后缀.a是固定的,Serven是库名称)
WindowslibServen.lib (后缀.lib是固定的,Serven是库名称)
制作Linux

① gcc Serven.c -c                    //  生成Serven.o文件
② ar rcs libServen.a Serven.o       

 //Serven.o文件 生成 Serven.a 静态库文件

 ar是archive工具

运行lib库

Serven@Desktop:User$ gcc Serven.c -lServen -L ./ -o mainServen
Serven@Desktop:User$ ls
Serven.c  mainServen  Serven.h
Serven@Desktop:User$ ./mainServen
"HelloWorld"
-l 是优先去/usr/lib文件里面找头文件

-L 告诉gcc编译器从 -L指定的路径去找静态库,默认是从/usr/lib、/usr/local/lib去找。

(2)动态库的命名和制作

动态库
命名规则Linuxlib***.so (前缀lib和后缀.so是固定的,***是库名称)
Windowslib***.dll (后缀.lib是固定的,***是库名称)
制作Linux

gcc -share -fpic ***.c -o lib***.so

生成后的动态库不能和静态库一样的 *** 作去运行。

这是因为静态库执行编译后会把lib编译到目标程序中了。

而动态链接库是运行时加载的,所以程序在执行的时候会查找这个动态库在不在。

那么解决这个问题有以下两种办法:

1.  因为程序默认在找库的时候在/usr/lib下去找,所以只需要把动态库复制放到这个路径下面就可以(这个需要超级用户才可以 *** 作)。

也就是运行mainServen之前限制性下面的 *** 作:

Serven@Desktop:User$ sudo cp libServen.so /usr/lib

2.  用export配置环境变量,相当于在Windows下配置环境变量一样,将动态库的路径配置一个环境变量叫做 LD_SO_SERVEN。

输入export就可以查看Linux的环境变量了。

Serven@Desktop:User$ export
declare -x HOME="/home/Serven"
declare -x INFINALTITY_FT_AUTOHINT_HORIZONTAL_STEM="15"
declare -x INFINALTITY_FT_AUTOHINT_BRIGHTNESS="/home/Serven"
...

然后在运行的时候先添加export这个环境变量,就可以运行了

Serven@Desktop:User$ export LD_SO_SERVEN="/home/usr/serven/desktop/serven"
Serven@Desktop:User$ ./mainServen

这种情况是一次性的,也就是针对当前窗口才有效,你可以将其写成一个脚本,在运行程序之前先运行这个脚本,脚本内容为:

Serven@Desktop:User$ vi startup.sh
export LD_SO_SERVEN="/home/usr/serven/desktop/serven"

这样就可以随时随地地的运行啦~~

3. 静态库和动态库的比较

静态库动态库
优点

gcc进行链接时会把静态库中的代码打包到可执行文件中,编译时加载,所以在发布程序的时候无须提供静态库,移植方便,运行快

gcc进行链接时,动态库的代码不会被打包到可执行程序中,运行时加载,所以在发布程序的时候需要提供动态库,
缺点但是消耗内存,更新部署发布麻烦

内存占用小,更新部署比较简单,运行慢

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/662839.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-18
下一篇 2022-04-18

发表评论

登录后才能评论

评论列表(0条)

保存