如何为C ++项目的CMAKE更改编译器和CXX_FLAGS?

时间:2012-10-09 21:13:36

标签: c++ visual-studio cmake devpartner

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以进行检测。

我该怎么做?

谢谢, JohnB

3 个答案:

答案 0 :(得分:1)

对于VS版本2008及更早版本....(VS6除外,它使用msdev)

更好地挖掘cmake我会说这个有更多知识的人将能够接受它并与它一起运行。

我确实发现CL和LINK命令实际上什么也没做,因为这只是将Devenv用于VS2003到2008以及MSBuild用于VS2010。将CL更改为NMCL无关紧要,因为MSBuild使用目标文件,这就是我的其他答案需要修改用户文件的原因。为什么我们需要在这里使用其他工具。

Devenv调用/ Build内部使用项目文件来了解需要构建哪些源文件。然后它将在内部调用createprocess以根据需要生成CL和LINK。这就是为什么在cmake文件中将CL更改为NMCL是没用的。

幸运的是,我们有另一种工具可以在这里使用....

我们需要改变 //制作节目 CMAKE_MAKE_PROGRAM:FILEPATH = C:/ Program Files(x86)/ Common Files / Micro Focus / NMShared / CTI / 11.1 / NMdevenv.EXE

和 CMAKE_BUILD_TOOL:INTERNAL = E:/PROGRA~1/MICROS~2.0/Common7/IDE/devenv.com

到C:/ Program Files(x86)/ Common Files / Micro Focus / NMShared / CTI / 11.1 / NMdevenv.EXE

现在,这是需要更多知识的人。我们还需要将仪器类型传递给nmdevenv作为第一个参数。

我相信可以做到这样的事情

set(CMAKE_MAKE_PROGRAM“$ {CMAKE_MAKE_PROGRAM}”/ nmon“)

这里的另一个问题是我们需要devenv也在路径中,所以Path env变量也需要正确设置。这可以通过运行正确的vscvars bat文件来完成。

希望这会有所帮助,如果你正在使用vs2008和之前的版本,请添加我在这里开始所需的步骤。我相信从长远来看它会帮助其他用户。如果我有更多的时间来研究这个问题,我会找到方法去做。

修改 的 好吧,我确实设法使用VS2008。我确实需要对我们的nmdevenv包装器进行更改,因为cmake正在破坏我们的SearchPath功能。

这就是我所做的。 如上所述替换了make程序 跑VCVars32 Ran cmake --build mytestproj 在BounsChecker下运行程序

现在我切换到传入/ nmtxon进行性能分析 这让我有点难过,因为它一直在编译错误检测

那是我在转换后的项目文件中找到它的时候

        <Tool
            Name="VCCLCompilerTool"
            AdditionalOptions=" /NMbcon /Zm1000"

将其更改为             

一切都很好。我有我的性能编译选项。

所以我回去并在CMakeCache.txt文件中修改了这一行,打开了GUI,configue,generate //在所有构建类型中编译器使用的标志。 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程序     添加/ NMon切换到标志 运行CmakeGui并再次生成

运行VCVars32 运行cmake --build文件

在devpartner下运行程序

答案 1 :(得分:0)

您使用的是哪个版本的Visual Studio?这会产生相当大的差异,因为多年来管理仪器的方式发生了变化。 。 。与Visual Studio版本相比,DevPartner的版本并不多。

答案 2 :(得分:0)

对于cmake文件不是100%肯定,但这是来自为Devpartner修改的旧VS 6 makefile。也许你可以发布makefile的相关部分供我查看。

/ nmbcon是一个编译标志,表示使用BC instrumentation / 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 / c

哦,另一张海报是正确的,因为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&gt;是什么类型的instrumetnt / nmbcon(Boundschecker)/ nmtxon(性能或覆盖范围)或两个键传递。

所以看起来像

<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>

这将是调试win32的Boundschecker,没有适用于版本win32,没有适用于调试版x64和版本x64的性能/覆盖范围

如果IsInstrumented 0该类型中的任何内容都无关紧要,因为它不会被传递。

仅供参考,如果您在VS2010中打开解决方案并对其进行检测,则会将其添加到vcxproj.user文件中。仪表设置也是通过project / config进行的。

如果不使用VS2010,我的下面的说明可能对这些版本是正确的。

对于完全披露,我是DevPartner仪器引擎的首席开发人员。