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

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

本文关键字:CXX FLAGS 编译器 CMAKE 何更改 C++ 项目      更新时间:2023-10-16

我目前正在开发一个非托管的Windows C++应用程序。

我是CMAKE和C++世界的新手。

我也是这个当前非托管C++应用程序的新手。

我正试图将DevPartner集成到我的构建中,以检测构建中的内存错误和运行时错误。

为了构建工具,我需要改为使用DevPartner编译器(nmcl.exe)。

此外,我需要将编译器设置添加到现有的CXX_FLAGS中以进行插入。

我该怎么做?

对于2008及更早版本的VS。。。。(除了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 Files/Micro-Focus/NMShared/CTI/11./NMdevenv.EXE

以及CMAKE_BUILD_TOOL:内部=e:/PROGRA~1/MICROS~2.0/Common7/IDE/devenv.com

到C:/程序文件(x86)/通用文件/Micro Focus/NMShared/CTI/11./NMdevenv.EXE

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

我相信它可以做一些类似的事情

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

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

希望这能有所帮助,如果你使用的是vs2008和以前的版本,请添加我在这里开始的步骤。从长远来看,我相信它会帮助其他用户。如果我有更多的时间来调查这件事,我会找到方法的。

编辑 我确实设法在VS2008中实现了这一点。我不得不对我们的nmdevenv包装器进行更改,因为cmake破坏了我们的SearchPath功能。

以下是我所做的。如上所述替换了make程序运行VCVars32运行cmake--构建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:custTest3TestTest.dirDebugRSP0000011
2568792.rsp /nologo /errorReport:queue
1>Test3.cpp
1>Instrumenting ..Test3Test3.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--生成文件

在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

将成为

CPP=nmcl.exe

CPP_PROJ=/nmcon/nologo/MD/W3/Gm/GX/Zi/Od/D"WIN32"/D"NDEBUG"/D"_WINDOWS"/D"_WINDLL"/D"_AFXDLL"/D

哦,另一张海报是正确的,因为Visual Studio的版本,事情发生了很大的变化。VS2010将生成过程更改为使用MSBuild,这导致我们完全修改了VS2010和2012的拦截和指令方式。

*编辑

今天早上,我确实下载并经历了Cmake实习的痛苦。对于VS2010,这似乎是一个非常简单的修改,就像我们的一个用户从命令行使用MSBuild所需要的一样。

在第一次构建后的out目录"Where to build the binary"中,将有.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_IsInstructioned告诉我们是否使用工具(1)(0)。最后一个键DevPartner_Instrumented_Type>是要指示的类型/nmbcon(Boundschecker)/nmtcon(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>

它将是调试win32的Boundschecker,对于发布win32没有任何内容,对于调试x64和发布x64 的性能/覆盖率没有任何内容

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

仅供参考,如果您在VS2010中打开解决方案并打开检测,它将为您添加到vcxproj.user文件中。检测设置也按项目/config进行。

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

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