Как изменить компилятор и CXX_FLAGS для CMAKE проекта C++?
I'm currently working on an unmanaged Windows C++ application.
I'm new to the world of CMAKE and C++.
I'm also new to the world of this current unmanaged C++ application.
I'm trying to integrate DevPartner into my build to instrument the build
for memory errors and runtime errors.
Для сборки для инструментовки мне нужно перейти на использование компилятора DevPartner (nmcl.exe). Кроме того, мне нужно добавить настройки компилятора в существующий CXX_FLAGS для инструментовки.
Как мне это сделать?
Спасибо, ДжонБ
3 ответа
Для версий VS 2008 и более ранних версий.... (кроме VS6 он использует msdev)
Хорошо копаясь больше в cmake, я скажу, что кто-то с большим знанием сможет взять это и бежать с этим.
Я обнаружил, что команды CL и LINK действительно ничего не делают, так как это только запускает Devenv для VS2003 до 2008 и MSBuild для VS2010. Изменение CL на NMCL не будет иметь значения, так как MSBuild использует целевые файлы, поэтому мой другой ответ требует изменения пользовательских файлов. И почему нам нужно использовать другой инструмент здесь.
Devenv, вызываемый с помощью /Build, внутренне использует файлы проекта, чтобы знать, какие исходные файлы нужно собрать. Затем он вызовет createprocess для внутреннего вызова CL и LINK по мере необходимости. Вот почему замена CL на NMCL в файлах cmake бесполезна.
К счастью, у нас есть еще один инструмент, который можно использовать здесь....
Нам нужно изменить // сделать программу CMAKE_MAKE_PROGRAM:FILEPATH=C:/Program Files (x86)/ Общие файлы /Micro Focus/NMShared/CTI/11.1/NMdevenv.EXE
и CMAKE_BUILD_TOOL:INTERNAL=e:/PROGRA~1/MICROS~2.0/Common7/IDE/devenv.com
в C: / Программные файлы (x86) / Общие файлы /Micro Focus/NMShared/CTI/11.1/NMdevenv.EXE
Теперь здесь нужен кто-то с немного большим знанием. Нам также нужно передать тип инструментовки в nmdevenv в качестве 1-х параметров.
Я верю, что это можно сделать примерно так
набор (CMAKE_MAKE_PROGRAM "${CMAKE_MAKE_PROGRAM} " /nmon")
Еще одна проблема заключается в том, что нам нужен devenv, чтобы быть в пути, поэтому переменная Path env также должна быть установлена правильно. Это можно сделать, запустив правильный файл vscvars bat.
Надеюсь, что это поможет, и если вы используете vs2008 и более ранние версии, пожалуйста, добавьте необходимые шаги к тому, что я начал здесь. Я уверен, что это поможет другим пользователям в долгосрочной перспективе. Если у меня будет больше времени для расследования, я найду способ сделать это.
Править Ну, мне удалось заставить это работать с VS2008. Мне пришлось внести изменения в нашу оболочку nmdevenv, так как cmake уничтожил нашу функциональность SearchPath.
Вот что я сделал. Заменил программу make, как указано выше. Ran VCVars32 Ran cmake --build mytestproj Запустил программу под BounsChecker.
Теперь я переключился на /nmtxon для профилирования производительности. Это меня немного озадачило, так как он продолжал компилироваться для обнаружения ошибок.
И именно тогда я нашел это в преобразованных файлах проекта
<Tool
Name="VCCLCompilerTool"
AdditionalOptions=" /NMbcon /Zm1000"
Изменил это на
и все хорошо. У меня была опция скомпилированного исполнения.
Поэтому я вернулся и изменил эту строку в файле CMakeCache.txt, открыл графический интерфейс, настроил, сгенерировал // флаги, используемые компилятором во всех типах сборки. CMAKE_CXX_FLAGS:STRING= /NMbcon /DWIN32 /D_WINDOWS /W3 /Zm1000 /EHsc /GR
Затем проект снова переключился на использование /NMbcon. Так что это правильное место для переключения, если вы хотите собрать все с нами. В противном случае используйте соответствующую строку Debug или release.
часть выходных данных Cmake
Microsoft (R) Visual Studio Version 9.0.30729.1.
Copyright (C) Microsoft Corp. All rights reserved.
1>------ Build started: Project: Test, Configuration: Debug Win32 ------
1>Compiling...
New Command line nmcl.exe /NMtxon @e:\cust\Test3\Test\Test.dir\Debug\RSP0000011
2568792.rsp /nologo /errorReport:queue
1>Test3.cpp
1>Instrumenting ..\Test3\Test3.cpp
1>Compiling manifest to resources...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.7600.16385
1>Copyright (C) Microsoft Corporation. All rights reserved.
1>Linking...
В итоге
Используйте Cmake для генерации CMakeCache.txt и каталогов. Модификация CmakeCahe. Используйте NMDevenv в качестве программы MAKE. Переключатель Add /NMon для флагов запускает CmakeGui и генерирует снова.
Запустить VCVars32 Запустить cmake --build file
Запустите программу под devpartner
Какую версию Visual Studio вы используете? Это имеет большое значение, так как управление инструментами изменилось за эти годы.,, не столько по версии DevPartner, сколько по версии Visual Studio.
Не уверен на 100% для файла cmake, но это из старого make-файла VS 6, модифицированного для Devpartner. Возможно, вы можете опубликовать соответствующий раздел make-файла, чтобы я мог на него посмотреть.
/ nmbcon - это флаг компиляции, который говорит, что использование BC инструментовки /nmtxon будет использоваться для анализа покрытия
CPP = cl.exe
CPP_PROJ = / nologo / MD / W3 / Gm / GX / Zi / Od / D "WIN32" / D "NDEBUG" / D "_WINDOWS" / D "_WINDLL" / D "_AFXDLL" / D "_MBCS" / D "_AFXEXT "/Fp"$(INTDIR)\main.pch" /Yu"stdafx.h "/ Fo" $ (INTDIR) \ "/Fd"..\bin\Debug\MAIN.pdb" / FD / GZ / c
Станет
CPP = nmcl.exe
CPP_PROJ = / nmbcon / nologo / MD / W3 / Gm / GX / Zi / Od / D "WIN32" / D "NDEBUG" / D "_WINDOWS" / D "_WINDLL" / D "_AFXDLL" / D "_MBCS" / D "_AFXEXT" /Fp"$(INTDIR)\main.pch "/Yu"stdafx.h" / Fo "$ (INTDIR) \" /Fd"..\bin\Debug\MAIN.pdb "/ FD / GZ / с
Да, и другой плакат - правильные вещи сильно изменились в зависимости от версии Visual Studio. VS2010 изменил процесс сборки для использования MSBuild, поэтому мы полностью изменили способ перехвата и установки для VS2010 и 2012.
* РЕДАКТИРОВАТЬ
Ну, я действительно скачал и прошел через стажировку в Cmake этим утром. Для VS2010 это, кажется, довольно простая модификация, как и требовалось бы одному из наших пользователей, использующих MSBuild из командной строки.
В выходном каталоге "Где собрать двоичные файлы" после первой сборки будут файлы.vcxproj.user. Это где вы должны добавить флаги для инструментовки
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<DevPartner_IsInstrumented>1</DevPartner_IsInstrumented>
<DevPartner_Instrumented_Type> /NMbcOn</DevPartner_Instrumented_Type>
</PropertyGroup>
</Project>
Это может быть повторяющийся раздел для каждого, который вы хотите построить.
Следующий ключ DevPartner_IsInstrumented говорит нам инструменту (1) или нет (0). Последний ключ DevPartner_Instrumented_Type> указывает, какой тип был передан instrumetnt /nmbcon (Boundschecker) /nmtxon (Performance или Coverage) или оба ключа.
Так это может выглядеть
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<DevPartner_IsInstrumented>1</DevPartner_IsInstrumented>
<DevPartner_Instrumented_Type> /NMbcOn</DevPartner_Instrumented_Type>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<DevPartner_IsInstrumented>0</DevPartner_IsInstrumented>
<DevPartner_Instrumented_Type> /NMbcOn</DevPartner_Instrumented_Type>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<DevPartner_IsInstrumented>0</DevPartner_IsInstrumented>
<DevPartner_Instrumented_Type> /NMbcOn</DevPartner_Instrumented_Type>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<DevPartner_IsInstrumented>1</DevPartner_IsInstrumented>
<DevPartner_Instrumented_Type> /NtxcOn</DevPartner_Instrumented_Type>
</PropertyGroup>
</Project>
это будет Boundschecker для отладки win32, ничего для выпуска win32, ничего для отладки x64 и Performance / Coverage для выпуска x64
Если IsInstrumented 0, все, что находится в типе, не будет иметь значения, так как оно не будет передано.
К вашему сведению, если вы откроете решение в VS2010 и включите инструментарий, он будет добавлен в файлы vcxproj.user для вас. И настройки инструментовки по проекту / конфигурации, а также.
Если не использовать VS2010, моя заметка ниже может быть правильной для этих версий.
Для полного раскрытия я являюсь ведущим разработчиком по инструментальному движку для DevPartner.