Dynamically loaded libraries 動態載入庫 #2 C++
這篇寫如何寫C++的動態載入庫,因為C++編譯器會修飾函式名稱,所以不能直接用C的方式寫庫
範例函式庫
mylib.h
extern "C" {
void hello();
void world();
}
與C的不同處是這裡要加上
extern "C" {}
包住不希望被編譯器修飾的函式hello.cpp
#include "mylib.h"
#include <iostream>
void hello(){
std::cout << "Hello" ;
}
world.cpp
#include "mylib.h"
#include <iostream>
void world(){
std::cout << "World" ;
}
編譯
$ g++ -c -fPIC hello.cpp world.cpp
$ g++ -shared -o libmylib.so hello.o world.o
編譯的方式除了從gcc改為g++之外,沒有其他改變
使用方式
main.cpp
int main() {
void* handle = dlopen("./libmylib.so", RTLD_LAZY);
void (*f1)() = (void (*)()) dlsym(handle, "hello");
void (*f2)() = (void (*)()) dlsym(handle, "world");
f1();
f2();
dlclose(handle);
return 0;
}
使用方式和C一模一樣,這裡假設不會出錯誤
編譯
編譯時要一樣連結 libdl,使用 -ldl
$ g++ main.cpp -ldl
執行
$ ./a.out
結果
HelloWorld
動態載入類別
這篇只寫到 C++ 使用動態載入函式庫並呼叫函式,並沒有提到載入類別,
那是因為 libdl 是 C 函式庫,本來就不包含類別的功能,
因此必須用其他手段來達成這樣的功能,
正好物件導向的多形可以達成這樣的功能,
至於如何實作寫在下一篇
那是因為 libdl 是 C 函式庫,本來就不包含類別的功能,
因此必須用其他手段來達成這樣的功能,
正好物件導向的多形可以達成這樣的功能,
至於如何實作寫在下一篇
請問一下,我應該怎麼匯入以下這個函數?
回覆刪除__declspec(dllexport) char __cdecl *GetFileSHA1(char *FileNameInPut, char *outSHA1, char *outError)
這是mingw編譯的