使用 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
的文件名。
当然,可执行文件的工作目录(基本上是您 运行 程序所在的目录)必须是库所在的目录。或者您需要包含库的路径。
我想将库编译为动态插件 (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
的文件名。
当然,可执行文件的工作目录(基本上是您 运行 程序所在的目录)必须是库所在的目录。或者您需要包含库的路径。