LINUX下创建与使用动态链接库(.SO)详解

需积分: 34 14 下载量 136 浏览量 更新于2024-08-01 收藏 86KB DOC 举报
"这篇文章主要介绍了如何在Linux环境下编译和使用动态链接库,通过一个具体的例子展示了生成`.so`文件(Linux下的动态链接库)的过程,并讲解了如何编写应用程序来调用这些动态链接库中的函数。" 在Linux操作系统中,动态链接库(Dynamic Linker Library,简称DLL)被称为共享对象(Shared Object,缩写为`.so`文件)。与Windows下的动态链接库(.DLL文件)类似,它们允许将常用的功能模块打包,多个程序可以在运行时共享同一份库文件,从而节省内存和硬盘空间。 创建一个动态链接库通常包括以下步骤: 1. **编译源代码**: 首先,你需要将源代码编译成对象文件(`.o`文件)。在这个例子中,作者使用了`c++`编译器,并通过`-I`选项指定了包含头文件的目录,如`-I.`表示当前目录,`-I$ICE_HOME/include`表示ICE库的头文件路径。编译命令如下: ``` $ c++ -I. -I$ICE_HOME/include -c *.cpp ``` 这条命令会为每个`.cpp`源文件生成一个对应的`.o`文件。 2. **生成动态链接库**: 接下来,使用`c++`编译器的`-shared`选项将对象文件链接成动态链接库。`-o`选项指定输出的库文件名,`-L`指定链接时查找库文件的目录,`-l`选项指定链接的库,例如`-lIce`和`-lIceUtil`。命令如下: ``` $ c++ -shared -o libMyApp.so *.o -L$ICE_HOME/lib -lIce -lIceUtil ``` 这将生成名为`libMyApp.so`的动态链接库。 3. **使用动态链接库**: 要在其他程序中使用这个动态链接库,你需要创建一个应用程序(如`Demo.cpp`和`Demo.h`),并在头文件`Demo.h`中声明库中提供的函数和结构体。例如: ```cpp #include <iostream> // 声明库中提供的结构体 struct MemoryInf { int TotalMem; // 总内存大小 int ValidMem; // 可用内存大小 int VirtualMem; // 虚拟内存大小 }; // 声明库中提供的函数 extern "C" { MemoryInf* GetMemoryInfo(); void FreeMemoryInfo(MemoryInf* memInfo); } ``` 然后在`Demo.cpp`中实现如何调用这些函数: ```cpp #include "Demo.h" int main() { MemoryInf* memInfo = GetMemoryInfo(); std::cout << "Total memory: " << memInfo->TotalMem << std::endl; std::cout << "Valid memory: " << memInfo->ValidMem << std::endl; std::cout << "Virtual memory: " << memInfo->VirtualMem << std::endl; FreeMemoryInfo(memInfo); return 0; } ``` 编译`Demo.cpp`时,需要链接到之前创建的动态链接库`libMyApp.so`: ``` $ c++ -o Demo Demo.cpp -L. -lMyApp ``` 运行`Demo`程序,就可以调用`libMyApp.so`中的功能了。 动态链接库在Linux系统中扮演着重要的角色,它使得软件开发变得更加模块化和高效。开发者可以创建自己的库并发布,供他人在不同的项目中复用,同时也方便了系统的升级和维护,因为只需更新库文件,不需要重新编译所有依赖它的应用程序。