linux加载动态库的两种方式
linux加载动态库的两种方式
linux中加载动态库分为运行时动态加载和启动时静态加载两种方式。
首先,写一个简单的test.cc
(1)//test.cc
//编译动态库 g++ test.cc -o libtest.cc -shared -fPIC
#include
int dosomethings(char* ch, int a, std::string s) {
std::cout << ch << " " << a << " " << s << std::endl;
return 0;
}
编译后生成libtest.so
(2)动态加载:
//main.cc
//使用dlopen实现动态库的动态加载,不需要使用库的头文件
//编译时需要加上-ldl
//g++ main.cc -ldl
#include
#include <dlfcn.h>
//根据test.cc中实现的函数类型定义一个函数指针
typedef int(Func)(char, int, std::string);
int main() {
void* handle;
Func fun = NULL;
char* error;
handle = dlopen("./libtest.so", RTLD_LAZY);
if (!handle) {
std::cout << “error” << std::endl;
return 0;
}
dlerror();
//需要注意的是,c++中引入了函数重载,需要使用nm libtest.so查看具体的函数名,而不再是简单的dosomethings
fun = (Func)dlsym(handle, “_Z12dosomethingsPciSs”);
if ((error = dlerror()) != NULL){
std::cout << “error”<<error << std::endl;
return 0;
}
fun("abc", 80, "abc");
dlclose(handle);
return 0;
}
(3)静态加载
静态加载时,需要引入test.cc的头文件,因为前面都没有用到头文件,这里先写个头文件test.h
//test.h
#ifndef TEST_H
#define TEST_H
int dosomethings(char* ch, int a, std::string s);
#endif // !TEST_H
//main.cc
//实现动态库的静态加载
//编译main函数时 需要指定libtest.so的路径,并且加上-ltest
//g++ main.cc -L ./ -ltest
#include
#include “test.h”
int main() {
dosomethings(“abc”, 80, “abc”);
return 0;
}
上一篇: Linux 动态库、静态库的生成、使用和优缺点分析
下一篇: Linux下静态库和动态库使用链接