Linux下C++ 动态库so的生成与调用
首先,动态库的生成是建立在linux下编写的函数已经可以正常调用运行,这里之进行动态库的生成以及调用需要注意的事项,并给出了示例。
单个函数
1.例如对于库函数,extern ”C“是将其函数暴露出来
//
extern "C" int add(int a, int b) {
return a + b;
}
2.使用g++函数将add生成动态库
g++ -shared -o
3.新建main()函数,并生成的放在main()同一级目录下
//
#include <iostream>
#include <> // 用于动态加载共享库
int main(int argc, char **argv) {
// 打开共享库
void* handle = dlopen("./", RTLD_LAZY);
if (!handle) {
std::cerr << "无法加载共享库: " << dlerror() << std::endl;
return 1;
}
// 获取共享库中的函数指针
typedef int (*AddFunction)(int, int);
AddFunction add = reinterpret_cast<AddFunction>(dlsym(handle, "add"));
if (!add) {
std::cerr << "无法获取函数指针: " << dlerror() << std::endl;
return 1;
}
// 调用加法函数
int result = add(5, 3);
std::cout << "5 + 3 = " << result << std::endl;
// 关闭共享库
dlclose(handle);
return 0;
}
4.编写Cmakelist
cmake_minimum_required(VERSION 2.8)#最低版本要求
project(Addition)#项目名称
set(CMAKE_CXX_STANDARD 11)#C++标准版本
add_executable(addition )#生成可执行addition
# 链接 libdl 库
target_link_libraries(addition dl)
target_link_libraries( addition -lpthread -lm)
5.编译并执行函数
mkdir build
cd build
cmake..
make
./addition
整体项目
对于大型项目,主函数需要的调用其他文件的函数,cmakelist中已经写好了addexcutable,并且生成的执行程序可以正常运行,现在只是简单将其附加上so文件的生成,对应操作如下。
1.首先,修改,附加上想要生成的库,并指定链接的库
#因为需要项目包含大量的cc文件,并且在不同的文件夹中,所以使用FILE,搜索其路径下文件并保存在SRC_FILES中
FILE(GLOB SRC_FILES "src/*.cc" "src/sat/*.cc")
ADD_LIBRARY(navmg ${SRC_FILES})
#将和其他cc文件一起生成动态库;主要需要使用的函数在函数名前需要使用extern ”C“将方法暴露出来
add_library(rts-lib SHARED src/app/ ${SRC_FILES})
# 如果需要链接其他库,请添加相应的链接命令,指南写的可以将依赖的库写在同一行,但是编译通过使用错误所以分行写,知道的大佬可以解释一下
target_link_libraries(rts-lib pthread)
target_link_libraries(rts-lib navmg )
target_link_libraries(rts-lib blas lapack)
2.动态库的调用声明及执行main函数
//
#include <iostream>
#include <> // 用于动态加载共享库
int main(int argc, char **argv) {
// 加载共享库
void* handle2 = dlopen("/home/MZ/navmg/build/", RTLD_GLOBAL |RTLD_LAZY);
if (!handle2) {
std::cerr << "Error loading shared library: " << dlerror() << std::endl;
return 1;
}
// 获取接口函数指针
typedef int (*RunLCRTSMain)(int, char**);
RunLCRTSMain run_lc_rts_main = (RunLCRTSMain)dlsym(handle2, "run_lc_rts_main");
if (!run_lc_rts_main) {
std::cerr << "Error loading function: " << dlerror() << std::endl;
dlclose(handle2);
return 1;
}
// 调用接口函数
int result2 = run_lc_rts_main( argc, argv);
// 卸载共享库
dlclose(handle2);
return result2;
return 0;
}
不需要进行修改
cmake_minimum_required(VERSION 2.8)#最低版本要求
project(Addition)#项目名称
set(CMAKE_CXX_STANDARD 11)#C++标准版本
add_executable(addition )#生成可执行addition
# 链接 libdl 库
target_link_libraries(addition dl)
target_link_libraries( addition -lpthread -lm)
4.编译并执行函数
mkdir build
cd build
cmake..
make
./addition -p