【问题标题】:Adding Visual Studio .resx files in cmake在 cmake 中添加 Visual Studio .resx 文件
【发布时间】:2012-10-29 18:18:01
【问题描述】:

在 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 的代码更改还是可以添加的其他内容?如果是代码更改,请指出必须在哪里进行代码更改,我可以考虑进行必要的更新。

【问题讨论】:

  • 这讨论了资源文件,但 .resX 文件与 .vcxproj 中设计器的 .h 文件相关联,并再次在 .vcxproj.filters 文件中使用。它比资源更复杂。如果它们没有正确设置,那么视觉工作室设计器将无法工作。由于这些都是项目文件中的纯文本项,我认为没有理由不能使用 CMAKE 来包含它们……但我不确定是否有某种方法可以在不更改代码的情况下对其进行扭曲到 CMAKE 本身。
  • 迟到总比没有好?我在 GitHub CMake 项目上做了一个拉取请求。希望这将成为未来的一项功能!

标签: visual-studio-2010 cmake visual-studio-2012 visual-studio-project


【解决方案1】:

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

【讨论】:

  • 请分享更改列表.. 谢谢
【解决方案2】:

现在在 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 文件,就像其他来源一样以及标题。我还把.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")

我从 here 了解到这一点。仅此而已!

【讨论】:

    【解决方案3】:

    您可以尝试创建源组:

    source_group(Resources FILES Form1.resX)
    

    但这肯定无济于事

    <DependentUpon>Form1.h</DependentUpon>
    <SubType>Designer</SubType>
    

    【讨论】:

    • 有没有办法构建“宏”之类的直接写入visual studio项目文件?这看起来越来越像代码更改。我会做出改变,但任何人都可以指出我可能会在代码中的哪个位置开始编织它?
    • 嗯,有 file(READ ...)file(WRITE ...) 命令,但我怀疑你可以使用它们来修改项目文件,因为这些文件在 CMake 从 @987654325 运行代码时不会生成@。所以,没有办法做到这一点,AFAIK。
    猜你喜欢
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2011-05-07
    • 2012-01-01
    相关资源
    最近更新 更多