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

Accesing CMake-generated dynamic library with 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 库?

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

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

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