dlopen載入動態庫
阿新 • • 發佈:2022-03-20
標頭檔案:
#include <dlfcn.h>
函式定義:
void * dlopen( const char * pathname, int mode);
mode:
RTLD_LAZY 暫緩決定,等有需要時再解出符號
RTLD_NOW 立即決定,返回前解除所有未決定的符號。
RTLD_LOCAL
RTLD_GLOBAL 允許匯出符號
RTLD_GROUP
RTLD_WORLD
返回值:
開啟錯誤返回NULL
成功,返回庫引用
plugin.h標頭檔案中定義介面
#ifndef __PLUGIN_H__ #define __PLUGIN_H__ #include"stdio.h" class IPlugin { public: virtual void print()=0; }; #endif
main.cpp
#include "plugin.h" #include <dlfcn.h> #include <stdlib.h> #include <stdio.h> typedef IPlugin* (*func)(); int main() { void* handle = dlopen("/home/hongrui/work/dlopen/libplugin.so", RTLD_NOW);if (!handle) { printf("dlopen:%s\n",dlerror()); return -1; } func getInterface = (func)dlsym(handle, "getInterface"); if (getInterface == NULL) { printf("dlsym:%s\n", dlerror()); return -1; } IPlugin* plugin = getInterface(); plugin->print();
dlclose(handle); return 0; }
編譯main.cpp 生成可執行檔案
g++ main.cpp -o main -ldl
plugin.cpp是動態庫cpp
#include "plugin.h" #include "stdio.h" class CPlugin : public IPlugin { public: CPlugin() {} virtual ~CPlugin(){} virtual void print() { printf("this is plugin\n"); } }; extern "C" __attribute__ ((visibility("default"))) IPlugin* getInterface() { return new CPlugin; }
編譯plguin.cpp生成動態庫libplugin.so
g++ -fvisibility=hidden -fpic -shared plugin.cpp -o libplugin.so -ldl