У меня довольно сложный проект на основе make
, который я пытаюсь вместо этого использовать в современном CMake. В Makefile
у меня есть несколько похожих общих библиотечных целей, которые имеют в основном идентичные флаги компиляции. Итак, это выглядело бы примерно так:
add_library(lib1 SHARED src1.cpp src2.cpp)
target_compile_options(lib1 PUBLIC -public-flag1 -public-flag2 -unique-flag3 PRIVATE -private-flag)
add_library(lib2 SHARED src3.cpp src4.cpp)
target_compile_options(lib2 PUBLIC -public-flag -public-flag2 PRIVATE -private-flag)
Есть ли способ, которым я могу абстрагировать общие зависимости, чтобы мне не приходилось повторять их под каждой целью? Казалось бы, Интерфейсная библиотека была бы способом сделать это, что-то вроде:
add_library(common_options INTERFACE)
target_compile_options(common_options
PUBLIC -public-flag1 -public-flag2
PRIVATE -private-flag
)
add_library(lib1 SHARED src1.cpp src2.cpp)
target_compile_options(lib1 PUBLIC -unique-flag3)
target_link_libraries(lib1 common_options)
add_library(lib2 SHARED src3.cpp src4.cpp)
target_link_libraries(lib1 common_options)
, что, по моему мнению, было бы net выигрышем для удобства обслуживания. Тем не менее, CMake выдает ошибку при этом, жалуясь, что цель интерфейса может содержать только опции INTERFACE
(я не могу добавить опции PRIVATE
к ней). Есть ли другой способ сделать это, который позволил бы мне инкапсулировать флаги PUBLIC
и PRIVATE
, которые являются общими для целей?