欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

linux加载动态库的两种方式

程序员文章站 2022-06-03 13:50:39
...

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;
}