Доступ к сгенерированной CMake динамической библиотеке с помощью dlopen - PullRequest
1 голос
/ 18 марта 2019

Я хочу скомпилировать библиотеку как динамический плагин (MODULE), а затем получить доступ к ней из исполняемого файла с помощью функции dlopen (), но она продолжает возвращать NULL.

Я предполагаю, что она не может найти библиотеку, поэтому я, вероятно, пропускаю sth в моем 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, так что, возможно, я просто не понял правильные источники - если это так, я любезно спрашиваю, может ли кто-нибудь сказать это прямо: как правильно скомпилировать и получить доступ к библиотеке MODULE с помощью CMake?

1 Ответ

1 голос
/ 18 марта 2019

При создании библиотеки в среде POSIX имя по умолчанию будет иметь префикс lib. Это объясняется в документации add_library.

Таким образом, для целевой библиотеки find связанный файл будет иметь имя libfind.so, то есть имя файла, которое нужно передать dlopen.

И, конечно, рабочий каталог исполняемого файла (в основном, каталог, из которого вы запускаете программу) должен находиться там, где находится библиотека. Или вам нужно указать путь к библиотеке.

...