cmake и генератор Visual Studio 15 2017 - определение типа сборки - PullRequest
0 голосов
/ 28 мая 2020

Я работаю над Windows 10. Я использую cmake с генератором Visual Studio 15 2017. CMakeLists.txt требует определения CMAKE_BUILD_TYPE, потому что он используется командой Конана, вызываемой из cmake (execute_process). Вот команда cmake:

cmake -DCMAKE_BUILD_TYPE=Release -G "Visual Studio 15 2017" ..

Когда я запускаю команду сборки таким образом:

cmake --build .

, я получаю следующую ошибку:

error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MTd_StaticDebug' in Tests.obj

Конан устанавливает выпуск библиотеки (MT_StaticRelease), но CMAKE_BUILD_TYPE игнорируется во время сборки. Сборка работает, когда я использую следующую команду:

cmake --build . --config Release

Как это работает? Когда мне нужно определить --config buildType? Что с другими генераторами, например Ninja?

1 Ответ

1 голос
/ 30 мая 2020

Visual Studio - это система с несколькими конфигурациями. Это означает, что тип сборки выбирается во время сборки, скажем, когда вы используете IDE, вы можете выбрать в это время конфигурацию Release или Debug и сборку. Поэтому, когда вы создаете решение Visual Studio (этап создания проекта или настройки), с cmake -G "Visual Studio ...", CMake не имеет значения для CMAKE_BUILD_TYPE.

Таким образом, вызовы CMake должны отличаться в зависимости от системы. :

В средах с несколькими конфигурациями, таких как Visual Studio, вы используете только 1 папку сборки:

$ mkdir build && cd build # assume we are in the folder containing CMakeLists.txt
$ cmake .. -G "Visual Studio 15 2017 Win64" # Unless building for 32 bits, add the Win64 
$ cmake --build . --config Release # Or open IDE, change config to Release and build 
$ cmake --build . --config Debug

В средах с одной конфигурацией, таких как g cc с Makefiles, вам нужно использовать 1 папка для каждой конфигурации

$ mkdir build_release && cd build_release # assume we are in the folder containing CMakeLists.txt
$ cmake .. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
$ cmake --build . 
$ cd .. && mkdir build_debug && cd build_debug
$ cmake .. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug
$ cmake --build . 

Другой проблемой является определение среды выполнения Visual Studio MT (stati c). Возможно, вы определили в своем профиле Conan compiler.runtime=MT, или он устанавливается напрямую в файле CMakeLists.txt. Конан не устанавливает такую ​​статическую c библиотеку MT_StaticRelease, она является частью Visual Studio. Если вы пытаетесь статически связать среду Visual Studio, используемые вами профили должны выглядеть так:

# for debug
$ conan install .. -s build_type=Debug -s compiler.runtime=MTd
# for release
$ conan install .. -s build_type=Release -s compiler.runtime=MT
...