我想将库编译为动态插件(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
库?>
答案 0 :(得分:1)
在POSIX环境中创建库时,默认名称将带有lib
前缀。 add_library
文档中对此进行了解释。
因此对于库目标find
,链接文件将命名为libfind.so
,这是您需要传递给dlopen
的文件名。
当然,可执行文件的工作目录(基本上是运行程序的目录)必须位于库所在的位置。或者,您需要包括库的路径。