我想将库编译为动态插件 (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/