【问题标题】:C++/CLI and CMakeC++/CLI 和 CMake
【发布时间】:2012-09-19 21:33:48
【问题描述】:

我正在尝试使用 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 正在传递给编译器.但是我仍然得到很多编译器错误,可能是因为它缺少引用。有谁知道正确设置的方法吗?

【问题讨论】:

  • 你有想过这个吗?我遇到了同样的问题(无法在 VS 2008 中设置 CLR 标志)。
  • 不,我们放弃了,它似乎与 2008 相比已被打破,但如果你发现了什么,请告诉我
  • 我发现设置 /CLR 标志确实有效。 VS2008的属性页没有选择这个选项,但是DLL确实编译为/clr。
  • @Kohanz 是的 /clr 被传递给编译器,我们遇到的问题是引用没有被正确处理(或者我们设置错误)并且我们得到了大量的编译错误。
  • 对于它的价值,我遇到了你描述的同样的问题,但没有找到解决方法。早在三月份我就不清楚你所说的引用没有被正确处理是什么意思,但我现在明白了。那时,我的 C++/CLI 项目只依赖于基本的 System 命名空间,不需要显式包含,但现在我需要使用 System.Drawing 并意识到我的构建现在只能在 VS2010 中工作,而不是 VS2008。

标签: .net c++-cli cmake


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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.dllPresentationCore.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 标志记录的规则不同。这些规则看起来倾向于使用运行时程序集,而不是引用程序集——这是不正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      相关资源
      最近更新 更多