c - 使用 dlopen 访问 CMake 生成的动态库

标签 c cmake dlopen

我想将库编译为动态插件 (MODULE),然后使用 dlopen() 函数从可执行文件访问它,但它一直返回 NULL。

我假设它找不到库,所以我可能在我的 CMakeLists.txt 中遗漏了某事。在这里:

cmake_minimum_required(VERSION 3.10)

project(find)

add_library(find MODULE ./src/find.c)
add_executable(foo ./src/foo.c)
target_link_libraries(foo ${CMAKE_DL_LIBS})

foo.c的代码:

#include <stdlib>
#include <dlfcn.h>

int main() {
    void* lib = dlopen(find.so);

    /* code using the library with dlsym */

    dlclose(lib);
    return 0;
}

我搜索了文档和其他问题,但没有任何帮助。我是 CMake 新手,所以我可能根本不了解正确的来源 - 如果是这样,我恳请问是否有人可以直截了当:如何使用 CMake 正确编译和访问 MODULE library ?

最佳答案

在 POSIX 环境中创建库时,默认名称将带有 lib 前缀。这在 add_library 中有解释。文档。

因此对于库目标find,链接文件将被命名为libfind.so,这是您需要传递给dlopen的文件名>.

当然,可执行文件的工作目录(基本上是您运行程序的目录)必须是库所在的目录。或者您需要包含库的路径。

关于c - 使用 dlopen 访问 CMake 生成的动态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55224005/

相关文章:

Linux内核模块编程的编译错误

c - 删除链表中的第一个节点

c++ - 列出 cmake 生成的 Visual Studio C++ 项目中的头文件

具有多个文件的项目中的 CMakeLists.txt

linux - 加载可执行文件或执行库

ios - 当通过代码在 iOS 上显式加载嵌入式框架时,alloc 和 class 返回 nil 对象

linux - 获取函数指针以在我没有直接加载的共享库中运行

c - 文件 CaesarShift 加密

c++ - 如何在不等待外部程序退出的情况下运行它?

c++ - 在 MinGW 和 MinGW-64 上执行命令后变量为空?