如何更改C++项目的CMAKE的编译器和CXX_FLAGS
How do I change the compiler and CXX_FLAGS for CMAKE of a C++ project?
我目前正在开发一个非托管的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仪器引擎的首席开发人员。
- xmake总是报告:错误:无法获取cxx的程序,为什么
- 在 Julia 中使用 boost 库和 Windows 上的 Cxx.jl
- Cxx.jl 在 Julia Complex 和 std::complex 之间进行转换
- 仅为C++文件(.h、.cpp、.cxx、.c)生成标记文件
- 在为 iOS 构建 aws-sdk-cpp 时,cmake 上的 CXX 编译器错误已损坏
- c++ 链接器错误"针对'.rodata.str1.1'的重新定位R_X86_64_32"链接 CXX 共享库 libsrt.so
- 使用CMake ExternalProject_Add构建mongo cxx驱动程序
- CMake 识别 MSVC(C 和 CXX),但仍抛出"未找到 CMAKE_*_COMPILER"
- Julia Cxx 在模块中打包不同的行为
- 检查工作正常的 CXX 编译器:/cygdrive/c/cygwin64/bin/clang++ -- 已损坏
- C++编译器 g++.exe 无法编译简单的测试程序 - 确定 CXX 编译器是否工作失败
- Mongodb Cxx 驱动程序测试在发布版本中崩溃 [ 在调试中工作正常]
- 使用 CXX 社区插件在 Sonarqube-5.6.6(LTS) 中导入 Gcov 报告
- 在 Ubuntu 16.04 下构建 Android linphone 给出了 CC 和 CXX 的 cmake 路径变
- 链接错误 CXX:找不到 -lvulkan
- 为什么在与静态库链接时强制执行 order(例如 source.cxx -lstatic)
- Android OpenCV Linked CXX 共享库失败
- 如何为声纳-cxx增加圈复杂性
- 重载的 QAbstractItemModel::flags 应该为无效的 QModelIndex 返回什么
- 'Linking CXX executable worldserver'失败