【问题标题】:Can I get the GUID generated by CMake for a specific vcproj at cmake time?我可以在 cmake 时获取 CMake 为特定 vcproj 生成的 GUID 吗?
【发布时间】:2013-03-15 20:39:04
【问题描述】:

序言:我正在尝试将我的 C# csproj 与我们的 C++ 和 C++/CLI 代码库 cmake 构建的其余部分集成。我收到了建议不要尝试这样做,因为 CMake 与 Visual Studio 中的 .NET 不能很好地配合,但是在实现了一些自定义之后,我觉得我已经很接近了。

我的部分自定义是使用 configure_file 命令在 CMake 时编辑 csproj 文件,根据正在发生的构建类型(例如 x86、x64)对其进行自定义。

问题是我使用了一些 ProjectReference 标签来引用 C++/CLI 项目:

<ProjectReference Include="..\..\WrapperProject\WrapperProject.vcproj">
  <Project>{7BD6E175-CDD1-4F8D-A3B2-0AC862E62C03}</Project>
  <Name>WrapperProject</Name>
</ProjectReference>

...并且 GUID 不能保持静态,因为只要重建 CMake 缓存,它们就会为项目更改(如果我弄错了,请纠正我)。

所以我想做的是在 CMake 时找到我们为这些项目计划的 GUID,并相应地编辑 vcproj 文件。

Google 告诉我人们可以使用“set_property”来设置 GUID,如下所示:

set_property(CACHE ${target_name}_GUID_CMAKE PROPERTY VALUE ${MY_GUID} )

...但我似乎无法找到等效的吸气剂。我尝试过这样的事情:

get_property(WRAPPER_GUID CACHE INTERNAL PROPERTY WrapperTargetName_GUID_CMAKE)

...没有运气。感谢您的帮助!

【问题讨论】:

  • 既然可以从 CMake 设置固定的项目 GUID,你应该也可以编写固定的 ProjectReference 标签,对吧?

标签: cmake guid vcproj


【解决方案1】:

在玩了更多之后,我意识到弗雷泽指出的 - 这种方法并不总是有效,因为我不能指望 GUID 在新的 CMake 运行中可用。所以我选择了我在 CMake 邮件列表中看到的建议,即自己显式设置 GUID 值。

所以在每个 C++/CLI 包装器项目的 CMakeLists.txt 中,我都有这样的内容:

# Set a global cache variable for this project GUID
# The TestAppNet csproj needs this GUID to properly reference this project
set_property(GLOBAL PROPERTY Wrapper_GUID "1897F4D1-E929-444E-9343-00F094113772") 
get_property(projectGUID GLOBAL PROPERTY Wrapper_GUID)
MESSAGE( STATUS "Setting project GUID to: ${projectGUID}")
set(Wrapper_GUID_CMAKE "${projectGUID}" CACHE INTERNAL "Project GUID")

在 C# 项目 CMakeLists.txt 中,我有这个:

get_property(CMAKE_WRAPPER_GUID GLOBAL PROPERTY Wrapper_GUID)
MESSAGE( STATUS "Setting Wrapper GUID to: ${CMAKE_WRAPPER_GUID}" )

...然后 CMAKE_WRAPPER_GUID 用作在 configure_file 命令期间填充的 .csproj 文件中的变量。

我不确定这是否有效,但它似乎有效!

【讨论】:

  • 如果有人想知道,这个 GUID 缓存条目在 cmGlobalVisualStudio7Generator::GetGUID 函数的 CMake 源代码中使用。 CMake Git commit c85367f408befa419185a4fec4816ea0ee3e1ee6 修改了行为,以便 CMake 不再创建 _GUID_CMAKE 缓存变量(有利于确定性 GUID)。但是,它看起来仍然会尊重用户在该变量中提供的 GUID。
【解决方案2】:

你的语法有点不对劲。您可能的意思是:

get_property(WRAPPER_GUID CACHE WrapperTargetName_GUID_CMAKE PROPERTY VALUE)

但是,这是获取价值的一种相对复杂的方式。你可以这样做:

set(WRAPPER_GUID ${WrapperTargetName_GUID_CMAKE})

最后,这并不理想,因为 GUID 在第一次运行 CMake 之后才可用。因此,对于新的构建树,您必须运行 CMake 两次才能使用它。

【讨论】:

  • 谢谢。这很有帮助。我最终以稍微不同的方式解决了这个问题,以避免你指出的困境。简而言之,我在 CMakeLists.txt 中为每个相应的 C++/CLI 项目显式设置值,然后在 C# 项目的 CMakeLists.txt 中检索它们并使用这些值生成 ProjectReference 节点。
猜你喜欢
  • 2014-05-24
  • 1970-01-01
  • 2011-03-14
  • 2012-02-11
  • 2015-08-12
  • 2020-09-02
  • 2023-03-16
  • 2015-12-28
  • 2015-09-05
相关资源
最近更新 更多