Модель зависимости цели, какая ссылка во время выполнения - PullRequest
0 голосов
/ 28 апреля 2019

Скажем, у меня есть две цели CMake, myexe и mylib, где mylib равно SHARED.

Я загружаю mylib из myexe во время выполнения (используя dlopen).Поэтому мое требование заключается в том, чтобы при сборке myexe, mylib также собирался.Насколько я понимаю, target_link_libraries() не является точным здесь, потому что связь только во время выполнения.

Как я могу смоделировать это в CMake?

Ответы [ 2 ]

3 голосов
/ 28 апреля 2019

Используйте простой add_dependencies для создания одной цели для автоматического создания другой:

# The library used via dlopen should be built with MODULE type.
add_library(mylib MODULE <mylib-source-files>)

add_executable(myexe <myexe-source-files>)
# For build myexe, mylib should also be built.
add_dependencies(myexe mylib)
0 голосов
/ 28 апреля 2019

Вы упомянули dlopen, поэтому я предполагаю, что вы запускаете свой код в Linux, где вам не нужно экспортировать функции dll с помощью __declspec (dllexport) и вам не нужна статическая библиотека экспорта.

Так что я думаю, что вы все делаете правильно, используя target_link_libraries.

Как вы можете видеть в этой ссылке , полный файл cmakelists.txt, охватывающий окна и Linux, будет:

cmake_minimum_required(VERSION 3.0)
project(sharedLibsDemo)                 # create a project with the given name
add_library(shared SHARED shared.cpp)   # compile "shared.cpp" and create a SHARED library called "shared"
add_executable(main main.cpp)           # compile "main.cpp" the the executable called "main"
include (GenerateExportHeader)          
GENERATE_EXPORT_HEADER(shared           # generates the export header shared_EXPORTS.h automatically
    BASE_NAME shared
    EXPORT_MACRO_NAME shared_EXPORTS
    EXPORT_FILE_NAME shared_EXPORTS.h
    STATIC_DEFINE SHARED_EXPORTS_BUILT_AS_STATIC)
target_link_libraries(main shared) 

Итак, это верно для прямого динамического связывания. В Linux вы можете проверить свои исполняемые зависимости, используя ldd, чтобы убедиться, что ваша программа ссылается на библиотеку.

Однако, если вы используете dlopen (), то вы уже указываете путь к dll и загружаете его динамически. Это означает, что вам не нужно использовать target_link_libraries () при сборке вашей программы.

В обоих случаях, по прямой ссылке или dlopen (), вам может потребоваться обновить переменную env LD_LIBRARY_PATH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...