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

我该怎么做呢?

谢谢,约翰B

4

3 回答 3

1

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

好吧,深入研究cmake,我会说这个知识渊博的人将能够接受并运行它。

我确实发现 CL 和 LINK 命令真的什么也没做,因为这只是启动了 VS2003 到 2008 的 Devenv 和 VS2010 的 MSBuild。将 CL 更改为 NMCL 并不重要,因为 MSBuild 使用目标文件,这就是我的其他答案需要修改用户文件的原因。以及为什么我们需要在这里使用另一个工具。

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

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

我们需要更改 //make program 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。

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

设置(CMAKE_MAKE_PROGRAM "${CMAKE_MAKE_PROGRAM} " /nmon")

这里的另一个问题是我们需要 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文件中的这一行打开GUI,配置,生成//编译器在所有构建类型期间使用的标志。CMAKE_CXX_FLAGS:STRING= /NMbcon /DWIN32 /D_WINDOWS /W3 /Zm1000 /EHsc /GR

然后项目切换回使用/NMbcon。因此,如果您想与我们一起编译所有内容,那么这是放置开关的正确位置。否则使用适当的调试或发布行。


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 开关到 flags 运行 CmakeGui 并再次生成

运行 VCVars32 运行 cmake --build 文件

在 devpartner 下运行程序

于 2012-10-10T13:32:08.880 回答
0

不是 100% 确定 cmake 文件,但这是来自为 Devpartner 修改的旧 VS 6 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 " /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> 是仪器的类型 /nmbcon (Boundschecker) /nmtxon (Performance or 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>

这将是 Debug win32 的 Boundschecker,Release win32 没有任何内容,调试 x64 和发布 x64 的 Performance / Coverage 没有任何内容

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

仅供参考,如果您在 VS2010 中打开解决方案并打开检测,它将为您添加到 vcxproj.user 文件中。仪表设置也是由项目/配置决定的。

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

为了全面披露,我是 DevPartner 检测引擎的首席开发人员。

于 2012-10-10T10:59:26.497 回答
0

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

于 2012-10-09T23:11:09.777 回答