Конфигурационное имя CMake для конкретной библиотеки при использовании мультиконфигурационных генераторов - PullRequest
0 голосов
/ 01 июля 2018

Бег cmake -G "Visual Studio 15 2017 Win64" в

cmake_minimum_required(VERSION 3.10)
project(test CXX)
add_library(MyLib SHARED foo.cpp)
install(TARGETS MyLib DESTINATION $ENV{TEMP})

создает проект с несколькими конфигурациями (Release, Debug, ...), которые затем можно построить с помощью Visual Studio.

Проблема: При установке библиотеки (т. Е. Построении сгенерированного проекта с именем INSTALL) сборка Debug успешно перезаписывает сборку Release и наоборот.

Я ищу средство для создания отдельного имени библиотеки для каждой конфигурации, например, MyLib для сборки выпуска и MyLibd для сборки отладки.

Что я пробовал: При использовании генератора с одной конфигурацией я бы запросил CMAKE_BUILD_TYPE и предоставил другое имя для библиотеки для каждой конфигурации. Однако "Visual Studio 15 2017 Win64" является мультиконфигурационным генератором, и поэтому я не могу применить такую ​​технику.

Я читал о выражениях генератора , но во всех примерах показаны только выражения генератора, применяемые к входным аргументам, таким как входные файлы или каталоги. И действительно, что-то вроде

add_library(MyLib$<$<CONFIG:Debug>:d> SHARED foo.cpp)

будет выдавать только неприятные сообщения об ошибках CMake и не даст желаемого эффекта зависимости имени библиотеки от конфигурации.

Конечно, я мог бы создать собственную команду, которая переименовывает файл во время установки, но в моем понимании, что в CMake есть «включенные батареи», должен быть более простой способ. Выражения генератора выглядели очень многообещающе, но, похоже, это не работает так, как я пытался.

Вопрос: Как сделать так, чтобы имя библиотеки зависело от конфигурации?

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

@ Намек Цыварева на установку свойства целевой библиотеки привел к еще одному решению: есть целевое свойство OUTPUT_NAME , и это позволяет использовать выражения генератора.

Итак, можно написать

set_target_properties(MyLib PROPERTIES OUTPUT_NAME "MyLib$<$<CONFIG:Debug>:d>")
0 голосов
/ 01 июля 2018

Вы можете присвоить DEBUG_POSTFIX свойство цели библиотеки для другого постфикса для отладочных сборок.

Или вы можете сделать это для всех целей, назначив CMAKE_DEBUG_POSTFIX переменную:

set(CMAKE_DEBUG_POSTFIX "d")
#... Create a library after the setting the postfix.
add_library(MyLib SHARED foo.cpp)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...