Как добавить зависимость на этапе компиляции без зависимостей на этапе компоновки - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть цели:

# target_include_directories(spdlog ...)
# target_compile_definitions(spdlog PUBLIC SPDLOG_COMPILED_LIB)

add_library(lib_common STATIC common.cpp)
target_include_directories(lib_common PUBLIC include_common)
target_link_libraries(lib_common spdlog)

add_library(lib INTERFACE)
target_include_directories(lib INTERFACE include)
target_link_libraries(lib INTERFACE lib_common)

add_executable(exe exe.cpp)
target_link_libraries(exe -Wl,--whole-archive lib_common -Wl,--no-whole-archive)

add_library(plugin SHARED plugin.cpp)
target_link_libraries(plugin INTERFACE lib) # What should be written here?

Текущее поведение: плагин компилируется без доступа к заголовкам lib_common (-I include_common). PUBLIC добавляет правильный флаг компиляции, а также ссылки -o libplugin.so liblib_common.a libspdlog.a.

Вариант использования: exe будет dlopen("./libplugin.so"), что означает, что plugin должен быть построен с -I include -I include_common -DSPDLOG_COMPILED_LIB, но не должен быть связан с lib_common.a или spdlog.a, поскольку они уже связаны с exe. Как PRIVATE, но наоборот (включите, не связывайте).

Вопрос: Как удалить связь с lib_common.a? Или, другими словами: как добавить зависимость к plugin на lib, чтобы команда компиляции плагина была похожа на plugin, зависит от lib, но команда связывания похожа на plugin, не зависит от lib.

...