2013-05-19 3 views
0

Я использую CMake для генерации файлов сборки (файлов makefile или файлов проекта) через Windows, OSX и Linux с компиляторами C и C++, родными для этих платформ. В Windows я gnerate VS проект 2010, и в конфигурации Release следующая встретилась ошибка:CMake: Установка правильных параметров компилятора только для одной платформы

Командная ошибка строки D8016: '/ ZI' и '/ оЬ2' параметры командной строки несовместимы

Ясно , CMake генерирует параметры оптимизации и отладки, которые несовместимы. Это настройка CMake по умолчанию, я не устанавливаю никаких специальных флагов.

Я исправлю это, изменив/ZI на/Z7 в параметрах проекта в Visual Studio, но это раздражает настройку непрерывной системы интеграции - мне нужно будет добавить скрипт для изменения файла проекта.

Могу ли я заставить CMake закрепить/Z7 (C7 Compatible debug info) вместо/ZI?

Кроме того, как я могу заставить его генерировать это только в конфигурации Release, а не в Debug?

ответ

4

Я не думаю, что CMake применяет /ZI к выпуску флажков по умолчанию - он, вероятно, применяется в другом месте вашего CMakeLists.txt или одного из файлов CMake, включенных в него.

Тем не менее, вы можете переключить флаг, делая что-то вроде:

if(MSVC) 
    string(REGEX REPLACE "/Z[iI7]" "" 
     CMAKE_CXX_FLAGS_RELEASE 
     "${CMAKE_CXX_FLAGS_RELEASE}") 
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Z7") 
endif() 

Первой линии полос всех /Zi, /ZI и /Z7 флагов, если они уже существуют в тростнике Release. Обратите внимание на использование " раунда "${CMAKE_CXX_FLAGS_RELEASE}". Важно, чтобы эта переменная CMake оставалась одной строкой. Если кавычки удалены, переменная становится разделенной точкой с двоеточием (т. Е. Каждое пространство заменяется точкой с запятой), и это не подходит для передачи компилятору.

Вы можете дать конфликтующие флаги здесь, если хотите. Поэтому, если вы удалили команду string(REGEX REPLACE ...) и просто оставили команду set, ${CMAKE_CXX_FLAGS_RELEASE} может содержать ... /ZI ... /Z7 ...", но до тех пор, пока /Z7 является последним флагом информации об отладке, он «выигрывает» и является тем, который окончательно применяется.

Однако, за небольшую попытку сначала очистить переменную, я считаю, что стоит лишить конфликтующие флаги.

+0

+1 для отличного ответа. Ваше решение действительно работает, протестировало его, но проблема была в файле CMakeLists.txt так же, как вы сказали. – zmilojko

Смежные вопросы