在Linux下進行C++動態鏈接庫(DLL)編程,通常使用的是共享對象(Shared Object),擴展名為.so
。以下是創建和使用共享對象的基本步驟:
首先,你需要編寫一個或多個源文件,然后編譯它們為位置無關代碼(Position Independent Code, PIC),最后鏈接成共享對象。
假設你有一個簡單的函數需要放在共享對象中:
// mylib.h
#ifndef MYLIB_H
#define MYLIB_H
#ifdef __cplusplus
extern "C" {
#endif
void hello_from_mylib();
#ifdef __cplusplus
}
#endif
#endif // MYLIB_H
// mylib.cpp
#include "mylib.h"
#include <iostream>
void hello_from_mylib() {
std::cout << "Hello from mylib!" << std::endl;
}
使用-fPIC
選項編譯源文件:
g++ -fPIC -c mylib.cpp -o mylib.o
將編譯好的目標文件鏈接成共享對象:
g++ -shared -o libmylib.so mylib.o
假設你有一個主程序需要使用這個共享對象:
// main.cpp
#include "mylib.h"
int main() {
hello_from_mylib();
return 0;
}
編譯主程序時需要指定共享對象的路徑,可以使用-L
選項指定庫路徑,使用-l
選項指定庫名(去掉lib
前綴和.so
后綴):
g++ -o main main.cpp -L. -lmylib
運行程序時,需要確保共享對象在系統的庫路徑中,可以使用LD_LIBRARY_PATH
環境變量來指定:
export LD_LIBRARY_PATH=.
./main
extern "C"
來避免名稱改編。soname
來管理共享對象的版本,避免不同版本之間的沖突。/usr/lib
或/usr/local/lib
),并更新ldconfig
緩存。在創建共享對象時,可以指定soname:
g++ -shared -Wl,-soname,libmylib.so.1 -o libmylib.so.1.0 mylib.o
然后創建符號鏈接:
ln -s libmylib.so.1.0 libmylib.so.1
ln -s libmylib.so.1 libmylib.so
這樣,當程序鏈接時,可以使用libmylib.so.1
,而運行時系統會自動找到libmylib.so
。
通過以上步驟,你可以在Linux下進行C++動態鏈接庫編程。