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

时间:2019-03-18 14:45:38

标签: 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库?

1 个答案:

答案 0 :(得分:1)

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

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

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