3

在 CMake 中,虽然它是一个出色的跨平台工具,但它也非常适合管理复杂的大型配置。我遇到的一个障碍是允许其他跨平台项目拥有特殊的“Visual Studio”项目。也就是说,在编译特定的 Visual Studio 项目时,我需要 CMake 的输出来拥有表单设计器 .resx 文件。这最终在一个标签中,如下所示:

<ItemGroup>
    <EmbeddedResource Include="Form1.resX">
      <DependentUpon>Form1.h</DependentUpon>
      <SubType>Designer</SubType>
    </EmbeddedResource>
</ItemGroup>

如果我可以编写自定义规则、编写文本或以其他方式对 Visual Studio .vcxproj 文件中的内容进行更低级别的控制,我就可以做到这一点。

.vcxproj.filters 文件有一个对应的条目:

<ItemGroup>
    <EmbeddedResource Include="Form1.resX">
      <Filter>Resource Files</Filter>
    </EmbeddedResource>
</ItemGroup>

还需要将资源文件添加到 .vcxproj:

<ItemGroup>
    <ResourceCompile Include="app.rc" />
</ItemGroup>

对于 .vcxproj.filters:

<ItemGroup>
    <ResourceCompile Include="app.rc">
      <Filter>Resource Files</Filter>
    </ResourceCompile>
</ItemGroup>

这是对 CMake 的代码更改还是可以添加的其他内容?如果是代码更改,请指出必须在哪里进行代码更改,我可以考虑进行必要的更新。

4

3 回答 3

1

因此,在 CMake 中似乎没有针对此问题的现有解决方案。我修改了 CMake 以允许它在 Visual Studio 解决方案文件中正确包含 .resX 文件。初步测试表明一切正常,但需要进行更多测试。代码更改很简单。然而,它提出的问题是手动管理 Visual Studio 的引用。CMake 确实有这方面的设施(尽管缺少文档)。问题主要是簿记,但是可以为参考、资源等配置许多选项,而 CMake 允许您添加到项目中,但配置并不好。我将试运行我的版本,如果一切顺利,请将其发送到 CMake 源代码中。

于 2012-10-31T12:45:18.917 回答
1

现在在 2018 年,我注意到有 CMake 源将 .resx 文件链接到标题。

if (this->ProjectType != csproj) {
    std::string hFileName = obj.substr(0, obj.find_last_of(".")) + ".h";
    this->WriteElem("DependentUpon", hFileName, 3);

    for (std::string const& i : this->Configurations) {
      this->WritePlatformConfigTag("LogicalName", i, 3);
      if (this->GeneratorTarget->GetProperty("VS_GLOBAL_ROOTNAMESPACE") ||
          // Handle variant of VS_GLOBAL_<variable> for RootNamespace.
          this->GeneratorTarget->GetProperty("VS_GLOBAL_RootNamespace")) {
        (*this->BuildFileStream) << "$(RootNamespace).";
      }
      (*this->BuildFileStream) << "%(Filename)";
      (*this->BuildFileStream) << ".resources";
      (*this->BuildFileStream) << "</LogicalName>\n";
    }
  }

请注意,我.resx像其他来源一样添加了所有文件以及 headers。我还将.resx文件放在与标题相同的目录中。

file(GLOB mytarget_SOURCES
    *.h
    *.cpp
    *.resx
)
add_executable(mytarget WIN32 ${mytarget_SOURCES})

它在没有根命名空间时有效!

但是当文件位于某个命名空间下时,我会遇到麻烦,例如test.vsgui.TestForm. 添加命名空间会破坏系统。这是由于 .vcxproj 文件中的逻辑名称部分。

VS_GLOBAL_ROOTNAMESPACE在那里救援。

set_target_properties(mytarget PROPERTIES VS_GLOBAL_ROOTNAMESPACE "test.vsgui")

它修复了构建/可执行文件,并且资源正确链接。

现在要使设计器工作,Visual Studio 需要对 dot-net 库的引用。为此,我们需要设置VS_DOTNET_REFERENCES属性。

set_target_properties(mytarget VS_DOTNET_REFERENCES "System;System.Data;System.Drawing;System.Windows.Forms")

我从这里学到了这一点。仅此而已!

于 2018-03-13T00:02:24.900 回答
0

您可以尝试创建源组:

source_group(Resources FILES Form1.resX)

但这绝对无助于获得

<DependentUpon>Form1.h</DependentUpon>
<SubType>Designer</SubType>
于 2012-10-30T03:38:16.480 回答