У меня есть цели:
# 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
.