# C++中怎么创建动态库 动态库(Dynamic Link Library, DLL)是Windows系统中常见的库文件类型,在Linux/Unix中称为共享对象(Shared Object, .so)。动态库在程序运行时被加载,可以实现代码复用、模块化开发和热更新等功能。本文将详细介绍在C++中创建动态库的完整流程。 ## 一、动态库基础概念 ### 1.1 动态库的特点 - **运行时加载**:程序运行时动态链接 - **节省内存**:多个程序可共享同一库副本 - **更新方便**:替换库文件无需重新编译主程序 - **跨语言支持**:不同语言编写的程序可调用同一动态库 ### 1.2 与静态库的区别 | 特性 | 动态库 | 静态库 | |-------------|---------------------|---------------------| | 链接时机 | 运行时 | 编译时 | | 文件大小 | 较小 | 较大 | | 更新方式 | 替换库文件 | 需重新编译 | | 内存占用 | 共享 | 独立 | ## 二、Windows平台创建动态库 ### 2.1 使用Visual Studio创建DLL 1. **新建项目**: - 选择"动态链接库(DLL)"项目模板 - 命名为`MyLibrary` 2. **添加头文件**(`mylibrary.h`): ```cpp // 导出宏定义 #ifdef MYLIBRARY_EXPORTS #define MYLIBRARY_API __declspec(dllexport) #else #define MYLIBRARY_API __declspec(dllimport) #endif // 导出函数声明 extern "C" MYLIBRARY_API int add(int a, int b);
mylibrary.cpp
):#include "mylibrary.h" MYLIBRARY_API int add(int a, int b) { return a + b; }
.dll
和.lib
文件g++ -shared -o mylibrary.dll mylibrary.cpp -Wl,--out-implib,libmylibrary.a
mylibrary.h
):#ifdef __cplusplus extern "C" { #endif int add(int a, int b); #ifdef __cplusplus } #endif
mylibrary.cpp
):#include "mylibrary.h" int add(int a, int b) { return a + b; }
g++ -fPIC -shared -o libmylibrary.so mylibrary.cpp
# 临时设置 export LD_LIBRARY_PATH=/path/to/library:$LD_LIBRARY_PATH # 永久设置(推荐) sudo cp libmylibrary.so /usr/local/lib sudo ldconfig
#include <windows.h> #include <iostream> typedef int (*AddFunc)(int, int); int main() { HINSTANCE hDll = LoadLibrary(TEXT("mylibrary.dll")); if (hDll) { AddFunc add = (AddFunc)GetProcAddress(hDll, "add"); if (add) { std::cout << "3 + 5 = " << add(3, 5) << std::endl; } FreeLibrary(hDll); } return 0; }
#include <dlfcn.h> #include <iostream> int main() { void* handle = dlopen("libmylibrary.so", RTLD_LAZY); if (handle) { typedef int (*AddFunc)(int, int); AddFunc add = (AddFunc)dlsym(handle, "add"); if (add) { std::cout << "3 + 5 = " << add(3, 5) << std::endl; } dlclose(handle); } return 0; }
// 头文件中 class MYLIBRARY_API MyClass { public: MyClass(); void doSomething(); }; // 实现文件中 MyClass::MyClass() { /*...*/ } void MyClass::doSomething() { /*...*/ }
Linux下推荐命名规范:
libname.so -> 主版本符号链接 libname.so.1 -> 次版本符号链接 libname.so.1.0.2 -> 实际库文件
#ifdef _WIN32 #define EXPORT __declspec(dllexport) #else #define EXPORT __attribute__((visibility("default"))) #endif
找不到动态库:
LD_LIBRARY_PATH
或安装到系统目录符号冲突:
ABI兼容性问题:
通过本文介绍的方法,您可以轻松创建和使用C++动态库,实现代码的模块化和复用。根据实际项目需求选择合适的导出方式和平台特定配置,可以构建出高效稳定的动态库组件。 “`
这篇文章涵盖了: 1. 动态库基本概念 2. Windows/Linux平台下的创建方法 3. 实际调用示例 4. 进阶技巧和常见问题 5. 采用规范的Markdown格式 6. 代码示例和对比表格等丰富内容
总字数约950字,可根据需要进一步调整或扩展特定部分。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。