动态链接库(.so)的生成和引用
一.简介
动态链接库:在Linux系统中,动态链接库(Dynamic Linking Library)是一种在运行时链接的共享库。相比于静态链接库,动态链接库可以在程序运行时加载,而不需要在编译时链接到程序中,这样可以减小可执行程序的大小,也方便了库的管理和更新。
动态链接库有两个主要的扩展名,分别是.so和.dll,其中.so文件是Linux系统下的动态链接库,.dll文件是Windows系统下的动态链接库。Linux系统下,动态链接库通常使用GCC编译器生成,使用-shared选项编译。在程序运行时,动态链接库会被动态地加载到内存中,多个程序可以共享同一个动态链接库,减少了内存占用和磁盘空间的使用。
动态链接库在Linux系统中被广泛使用,许多系统库和第三方库都是动态链接库,例如libc、libpthread、libssl等等。动态链接库的使用可以提高程序的可移植性、可维护性和安全性,是Linux系统下的重要特性之一。
二.动态链接库的生成
在Linux中,可以使用gcc命令将多个目标文件生成一个动态链接库(也称为共享库)。生成动态链接库的步骤如下:
--sodir
|--so.c
|--s0.h
|--libtest.so
gcc so.c -fPIC -shared -L./sodir -o libtest.so
-fPIC:生成与位置无关的代码,这是生成动态链接库所必需的。
-shared:告诉链接器生成动态链接库而不是可执行文件.
-L:指定源文件路径,源文件在当前编译路径下不需要。
-o:指定输出文件名.
so.c:参与编译的源文件.
libtest.so:lib为前缀,test为库名,.so为后缀。
注意:库名可以自由取名,但是前缀和后缀必须遵循规范,否则系统无法识别。
三.引用动态链接库
-
首先,我们创建一个名为 libhello.c 的源文件,其中包含了一个简单的 hello 函数:
//libhello.c #include <stdio.h> void hello() { printf("Hello, world!\n"); }
-
接着,我们使用 gcc 命令来编译这个源文件,并生成一个名为 libhello.so 的动态链接库:
gcc -fPIC -shared -o libhello.so libhello.c
-
现在,我们可以在另一个源文件中引用这个动态链接库,例如,我们创建一个名为 main.c 的源文件:
//main.c void hello(); int main() { hello(); return 0; }
-
再编译main.c,生成可执行文件:
gcc -o main main.c -L. -lhello -L:指定so文件所在的目录; -l:动态链接库名,去除前缀lib,去除后缀.so;
-
最后,执行main:
保存信息,找不到动态链接库文件。
解决方法:将动态链接库所在的文件添加到环境变量中:
export LD_LIBRARY_PATH=$(pwd)
文章来源:https://www.toymoban.com/news/detail-621250.html
其它解决方式:
1.临时性的 export 环境变量=$环境变量:你要添加的路径
2.写入/etc/profile
3.写入到家目录的.bashrc
4.写入到/etc/environment中文章来源地址https://www.toymoban.com/news/detail-621250.html
到了这里,关于linux 动态链接库(.so)的生成和引用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!