Когда использовать параметры/определения компиляции PRIVATE vs INTERFACE для цели в CMake?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Когда использовать параметры/определения компиляции PRIVATE vs INTERFACE для цели в CMake?

Сообщение Anonymous »

У меня есть проект C++ CMake с тремя целями:
  • Цель библиотеки интерфейсов MyProjectInterfaces (определяет некоторые интерфейсы в файлах hpp)
  • Библиотека MyProjectFoo (реализует 1/2 интерфейсов в MyProjectInterfaces)
  • Библиотека MyProjectBar (реализует другая половина интерфейсов в MyProjectInterfaces)
Нисходящие проекты, использующие мою библиотеку, могут захотеть реализовать интерфейсы MyProjectInterfaces самостоятельно или использовать реализации Foo, или реализации Bar, или и то, и другое.
Я хочу добавить некоторые функции/параметры/определения компиляции ко всем целям в моем проекте, минимизируя при этом код дублирование. Я знаю два способа сделать это.
МЕТОД 1: Самый простой способ — добавить их в MyProjectInterfaces с областью действия INTERFACE:

Код: Выделить всё

    set(DEBUG_COMPILE_OPTIONS
-Wall -Werror
)
set(RELEASE_COMPILE_OPTIONS

)

target_compile_features(MyProjectInterfaces INTERFACE
cxx_std_17
)

target_compile_definitions(MyProjectInterfaces INTERFACE
SDK_VERSION_MAJOR=${CMAKE_PROJECT_VERSION_MAJOR}
SDK_VERSION_MINOR=${CMAKE_PROJECT_VERSION_MINOR}
SDK_VERSION_PATCH=${CMAKE_PROJECT_VERSION_PATCH}
)

target_compile_options(MyProjectInterfaces INTERFACE
$
$
)
МЕТОД 2. В качестве альтернативы я могу изменить область действия на PRIVATE, обернуть вызовы target_compile_XXX в макрос/функцию и вызвать ее для каждой цели.

Код: Выделить всё

    macro(set_options myTarget)
target_compile_features(${myTarget} PRIVATE
cxx_std_17
)

target_compile_definitions(${myTarget} PRIVATE
SDK_VERSION_MAJOR=${CMAKE_PROJECT_VERSION_MAJOR}
SDK_VERSION_MINOR=${CMAKE_PROJECT_VERSION_MINOR}
SDK_VERSION_PATCH=${CMAKE_PROJECT_VERSION_PATCH}
)

target_compile_options(${myTarget} PRIVATE
$
$
)
endmacro()

# This probably won't work or be necessary because its an interface library target?
# set_options(MyProjectInterface)

# Set compile options on actual compiled libraries
set_options(MyProjectFoo)
set_options(MyProjectBar)
Насколько мне известно, оба метода распространяют все определения/параметры, которые я хочу, на каждую цель в моем проекте. Однако МЕТОД 1 также распространит эти варианты/определения на проекты-потребители. Желательно ли это?
В Интернете много документации о том, как передать PRIVATE/

Код: Выделить всё

PUBLIC/INTERFACE
аргументы в target_compile_XXX(...), но мне удалось найти очень мало информации о том, как и когда выбирать между ними.

Подробнее здесь: https://stackoverflow.com/questions/734 ... et-in-cmak
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»