繁体   English   中英

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

[英]How do I change the compiler and CXX_FLAGS for CMAKE of a C++ project?

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

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

好吧,对cmake进行更多的挖掘,我会说这个有更多知识的人将能够接受并运行它。

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

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

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

我们需要更改//使程序CMAKE_MAKE_PROGRAM:FILEPATH = C:/程序文件(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作为第一个参数。

我相信可以做到这样

设置(CMAKE_MAKE_PROGRAM“ $ {CMAKE_MAKE_PROGRAM}” / nmon“)

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

希望这对您有所帮助,如果您使用的是vs2008及更早版本,请在此处开始的步骤中添加所需的步骤。 我相信从长远来看,它将帮助其他用户。 如果我有更多时间进行调查,我会找到解决方法。

编辑好,我确实设法使它与VS2008一起使用。 我确实必须对我们的nmdevenv包装器进行更改,因为cmake破坏了SearchPath功能。

这是我所做的。 如上替换生成程序Ran VCVars32 Ran cmake --build mytestproj Ran BounsChecker下的程序

现在,我切换到/ nmtxon进行性能分析,这让我很困惑,因为它一直在编译以进行错误检测。

那就是当我在转换后的项目文件中找到此文件时

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

更改为

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

因此,我回过头来修改了CMakeCache.txt文件中的这一行,打开了GUI,进行配置,生成//所有编译类型期间编译器使用的标记。 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下运行程序

您正在使用哪个版本的Visual Studio? 多年来,随着仪器的管理方式发生了变化,这产生了很大的差异。 DevPartner版本不如Visual Studio版本多。

不能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所需要的那样。

第一次构建后,在out dir“在哪里构建二进制文件”中将有.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,这将是Boundschecker,对于win32版本,将是什么,对于x64调试,将是什么;对于x64版本,则是性能/覆盖率

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

仅供参考,如果您在VS2010中打开解决方案并启用检测功能,则会为您添加到vcxproj.user文件中。 仪器设置也可以通过项目/配置进行。

如果不使用VS2010,我的以下注释可能适用于那些版本。

为了全面披露我是DevPartner仪器引擎的首席开发人员。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM