Как лучше установить выходной каталог для проекта CMake C ++, созданного Visual Studio 2017? - PullRequest
0 голосов
/ 06 июня 2019

Я использовал Visual Studio 2017 для создания настольных проектов C ++ с использованием файлов .vcxproj. Мне нравится поведение по умолчанию, когда выходной каталог является подкаталогом ниже проекта. Например:

|-myproj.sln
|-myproj.vcxproj
|-----------------|--x64 --|-- myproj_release --|-- myproj.exe

Теперь я хочу определить сборку, используя CMake вместо .vcxproj, чтобы я мог выполнять сборку с помощью кода Visual Studio в качестве альтернативы Visual Studio 2017.

Я конвертировал свой .vcxproj в проект CMake, используя cmake-converter. Полученный CMakeLists.txt содержит:

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${OUTPUT_DEBUG}")
  set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${OUTPUT_DEBUG}")
  set(CMAKE_EXECUTABLE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${OUTPUT_DEBUG}")
else()
  set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${OUTPUT_REL}")
  set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${OUTPUT_REL}")
  set(CMAKE_EXECUTABLE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${OUTPUT_REL}")
endif()

Когда я открываю этот CMakeLists.txt в Visual Studio 2017 и собираю его, он помещает исполняемый файл в подкаталог CMakeBuilds моего пользовательского каталога. Я думаю, это потому, что Visual Studio 2017 определяет CMAKE_BINARY_DIR.

Каков наилучший способ получения выходного каталога в исходном каталоге, как это происходит с моим файлом .vcxproj?

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

Visual Studio является генератором мультиконфигурации . То есть он конфигурирует проект для нескольких конфигураций одновременно . Из-за этого при использовании таких генераторов переменная CMAKE_BUILD_TYPE не содержит имени конфигурации, она просто пуста.

По умолчанию, с многоконфигурационными генераторами, переменные типа CMAKE_LIBRARY_OUTPUT_DIRECTORY автоматически добавляются с подкаталогом для конфигурации . Есть два способа справиться с этим поведением:

  1. Использовать выражения генератора при определении переменной. Это выражение может быть оценено условно, в зависимости от типа конфигурации. E.g.:

    # For Debug configuration this will be evaluated to
    #   '${CMAKE_BINARY_DIR}/${OUTPUT_DEBUG}'
    # For Release configuration this will be evaluated to
    #   '${CMAKE_BINARY_DIR}/${OUTPUT_REL}'
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/<$<$CONFIG:DEBUG$>:${OUTPUT_DEBUG}$><$<$CONFIG:RELEASE$>:${OUTPUT_REL}$>")
    
  2. Используйте _<CONFIG> версии переменной. E.g.:

    # Output directory for libraries in Debug configuration
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/${OUTPUT_DEBUG})
    # Output directory for libraries in Release configuration
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/${OUTPUT_REL})
    
1 голос
/ 07 июня 2019

Я думаю, что ответом на мой вопрос является изменение buildRoot в CmakeSettings.json:

"buildRoot": "${workspaceRoot}\\build\\${name}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...