10

我正在尝试使用 cmake 设置 C++/CLI 项目。我已经使用 Visual Studio 2010 成功地做到了这一点,但我现在正在使用需要 Visual Studio 2008 的旧解决方案。在 Visual Studio 2010 中,像这样设置我的 cmake 就足够了:

set_target_properties(${PROJECT_NAME} PROPERTIES VS_DOTNET_REFERENCES "${CMAKE_CURRENT_SOURCE_DIR}/../OrionMaster/3rdParty/GMap.NET.Core.dll;System;System.Core;System.Data;System.Drawing;System.Xml;WindowsBase")
set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/clr /EHa")
set_target_properties(${PROJECT_NAME} PROPERTIES DEBUG_POSTFIX "d")

if(CMAKE_CXX_FLAGS_DEBUG MATCHES "/RTC1")
   string(REPLACE "/RTC1" " " CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
endif()

if(CMAKE_CXX_FLAGS MATCHES "/EHsc")
   string(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
endif()

然后,当我在 Visual Studio 2010 下检查该项目时,我可以看到所有引用并且“公共语言运行时支持”已打开。当我在 Visual Studio 2008 中尝试时,我没有看到任何引用,并且项目设置为“无公共语言运行时支持”如果我再查看编译器选项,我可以看到 /clr 正在传递给编译器. 但是我仍然得到很多编译器错误,可能是因为它缺少引用。有谁知道正确设置它的方法?

4

2 回答 2

9

对 VS_DOTNET_REFERENCES 属性的唯一“真实”源代码引用位于 CMake 源文件 Source/cmVisualStudio10TargetGenerator.cxx 中。

这在实践中意味着什么:VS_DOTNET_REFERENCES 仅针对 Visual Studio 2010 的 CMake 生成器和任何继承自它的生成器实现。(现在存在于 VS 2012 和 2013 的最新 CMake 版本中......)

修改 CMake 源代码以支持 Visual Studio 早期版本的此属性可能是可能的,但目前尚未完成。

于 2013-09-09T21:06:08.737 回答
2

正如@DLRdave 指出的那样,CMake 仅对 Visual Studio 2010 生成器执行此操作。

试试这个解决方法,而不是VS_DOTNET_REFERENCES其他生成器:

# Note that /FU and ${asmPath} must not be separated by a space, else CMake
# will remove duplicate "/FU" options.
target_compile_options(target PRIVATE "/FU${asmPath}")

对于像System.dll,PresentationCore.dll等系统程序集,您应该通过asmPath. 您需要使用参考程序集,而不是计算机上未安装的程序集。例如,对于 Visual Studio 2008 中 3.5 的目标框架,您需要按以下顺序在这些目录中搜索引用的文件:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.0
C:\Windows\Microsoft.NET\Framework\v2.0.50727

您会注意到,如果您使用 MSBuild 构建标准 C# 或 C++/CLI 项目,您会看到它还将绝对路径传递到上述位置的文件(尝试检查构建日志)。除了上面显示的旧 v2.0 位置之外,您希望在上述位置之外使用非参考程序集。

有关参考程序集的更多信息:http: //blogs.msdn.com/b/msbuild/archive/2007/04/12/new-reference-assemblies-location.aspx

不幸的是,要真正了解解决这些位置的规则,您必须在C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets文件中卑躬屈膝。它没有完全公开记录。 另请注意,这些搜索/解析规则与为csc.exe /referencecl.exe /FU标志记录的规则不同。这些规则看起来他们倾向于使用运行时程序集,而不是引用程序集——这是不正确的。

于 2015-09-15T22:30:59.297 回答