Linux下C++ 动态库so的生成与调用

时间:2025-02-25 07:24:23

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