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
发布于 2012-10-10 21:32:09
对于VS版本2008及更早版本...(除了VS6,它使用msdev)
深入研究cmake,我会说,有更多知识的人将能够使用它并运行它。
我确实发现CL和LINK命令实际上什么也做不了,因为这只是启动了VS2003到2008的Devenv和VS2010的MSBuild。将CL改为NMCL并不重要,因为MSBuild使用目标文件,这就是我的另一个答案需要修改用户文件的原因。以及为什么我们需要在这里使用另一个工具。
通过/Build调用的Devenv在内部使用项目文件来了解需要构建哪些源文件。然后,它将在内部调用createprocess以根据需要生成CL和LINK。这就是为什么在cmake文件中将CL改为NMCL是无用的。
幸运的是,我们还有另一个工具可以在这里使用……
我们需要更改//make程序CMAKE_MAKE_ program :FILEPATH=C:/Program Files (x86)/Common文件/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")
这里的另一个问题是,我们还需要在path中包含devenv,因此需要正确设置Path env变量。这可以通过运行正确的vscvars bat文件来完成。
希望这对你有所帮助,如果你正在使用vs2008和以前的版本,请在我开始的基础上添加所需的步骤。我相信从长远来看,它会对其他用户有所帮助。如果我有更多的时间调查这件事,我会找到方法去做的。
编辑好的,我用VS2008实现了这一点。我不得不更改我们的nmdevenv包装器,因为cmake破坏了我们的SearchPath功能。
这就是我所做的。替换了上面的make程序运行VCVars32运行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程序添加/NMon开关到标志运行CmakeGui并再次生成
运行cmake -- VCVars32文件
在devpartner下运行程序
发布于 2012-10-10 07:11:10
您使用的是哪个版本的Visual Studio?这会产生很大的不同,因为这些年来仪器的管理方式已经发生了变化。。。与其说是按DevPartner的版本,不如说是按Visual Studio的版本。
发布于 2012-10-10 18:59:26
对于cmake文件不是100%确定,但这是来自为Devpartner修改的旧VS6 makefile。也许您可以发布makefile的相关部分供我查看。
/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“”$(INTDIR)“”stdafx.h“”$(INTDIR)\“
会变成
CPP=nmcl.exe
CPP_PROJ= /nmbcon /nologo /MD /W3 /Gm /GX /Zi /Od /D "WIN32“/D "NDEBUG”/D "_WINDOWS“/D "_WINDLL”/D "_AFXDLL“/D”$(INTDIR)“”stdafx.h“”$(INTDIR)\“
哦,另一张海报是正确的,因为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>是要检测的类型,而不是/nmbcon (边界检查器)、/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的边界检查器,不适用于版本win32,不适用于调试x64,以及适用于版本x64的性能/覆盖范围
如果IsInstrumented为0,则类型中的任何内容都无关紧要,因为它不会被传递。
仅供参考,如果您在VS2010中打开解决方案并打开检测功能,则会将其添加到vcxproj.user文件中。并且工具设置也是由project / config设置的。
如果不使用VS2010,我下面的注释可能对这些版本是正确的。
对于完整的披露,我是DevPartner工具引擎的首席开发人员。
https://stackoverflow.com/questions/12808517
复制相似问题