一、简介
Linux下的动态链接库文件(Dynamic Link Library),也被称为共享对象文件(Shared Object)。在Linux系统中,动态链接库文件的后缀名通常是".so"(Shared Object)。
动态链接库文件是包含可被程序在运行时动态加载和链接的代码和数据的文件。它们提供了一种共享代码和资源的机制,多个程序可以共享同一个动态链接库,从而节省了系统资源和内存空间。
动态链接库文件在编译和链接过程中不会被静态地嵌入到可执行文件中,而是在程序运行时被动态加载到内存中。这样,不同的程序可以共享同一个动态链接库,从而减少了存储空间的使用,并且可以使软件更新更加便捷,只需更新动态链接库而不需要重新编译整个程序。
在Linux系统中,可以使用ldd
命令查看可执行文件或其他动态链接库文件所依赖的动态链接库文件。可以使用ldconfig
命令来管理系统中的动态链接库。
二、创建及编译步骤
当在Linux系统中创建和编译动态链接库文件时,可以按照以下步骤进行操作:
-
编写源代码:首先,您需要编写包含所需功能的源代码文件,使用适当的编程语言(如C、C++等)。确保在代码中使用适当的函数导出标记(如
__attribute__((visibility("default")))
),以便在动态链接库中可见。 -
编写编译器选项文件:创建一个包含编译器选项的文本文件,以便在编译过程中指定动态链接库的属性。您可以在选项文件中包含诸如编译器标志(如
-fPIC
)和链接器标志(如-shared
)等。 -
使用编译器编译源代码:使用编译器将源代码编译为目标文件。例如,使用
gcc
编译C源代码:gcc -c -fPIC source.c -o source.o ``` 这将生成一个目标文件 `source.o`。
-
创建动态链接库:使用编译器将目标文件链接为动态链接库文件。指定
-shared
选项以创建共享对象文件,并使用-o
选项指定输出文件名。例如:gcc -shared source.o -o libexample.so ``` 这将生成一个名为 `libexample.so` 的动态链接库文件。
-
设定库路径:将生成的动态链接库文件放置在适当的库路径中,以便系统能够找到它。常见的库路径包括
/usr/lib
、/usr/local/lib
等。您可以将动态链接库文件复制到其中一个路径下,或者使用LD_LIBRARY_PATH
环境变量指定自定义的库路径。 -
使用动态链接库:在您的程序中,可以使用动态链接库提供的功能。在编译和链接您的程序时,确保指定正确的动态链接库文件名和路径,以便程序能够正确地加载和链接动态链接库。
这些是一般创建和编译动态链接库文件的步骤。具体的步骤可能会因编程语言、编译器和构建系统而有所不同。
三、具体示例
首先,在对应目录下创建一个名为 example.c
的源代码文件,内容如下:
#include <stdio.h>
__attribute__((visibility("default")))
void say_hello() {
printf("Hello from the dynamic library!\n");
}
接下来,使用以下命令将源代码编译成动态链接库文件:
gcc -shared -fPIC example.c -o libexample.so
这将生成一个名为 libexample.so
的动态链接库文件。
在生成.so文件之后,编写一个使用动态链接库的简单程序。创建一个名为 main.c
的源代码文件,内容如下:
#include <stdio.h>
extern void say_hello();
int main() {
printf("Calling a function from the dynamic library...\n");
say_hello();
return 0;
}
使用以下命令将 main.c
编译为可执行文件,并链接动态链接库:
gcc main.c -L. -lexample -o main
这将生成一个名为 main
的可执行文件。通过使用 -L
选项指定动态链接库的路径(这里是当前目录),并使用 -l
选项指定动态链接库的名称(去掉 lib
前缀和 .so
后缀),程序能够正确地链接动态链接库。
在运行之前,需要先指定动态链接库的路径,应设置环境变量,将当前目录添加进去
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
需要注意的是,export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
的修改只对当前会话有效
之后运行 main
可执行文件
./main
如果遇到权限问题,可以进行如下设置
chmod +x main.c
结果如下所示:
Calling a function from the dynamic library...
Hello from the dynamic library!