# 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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。