在cmake中添加Visual Studio .resx文件

时间:2012-10-29 18:18:01

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

在CMake中,虽然它是一个很好的跨平台工具,但它也非常适合管理复杂和大型配置。我遇到的一个障碍是允许一个其他跨平台项目只有特殊的“Visual Studio”项目。也就是说,我需要CMake的输出,在编译特定的visual studio项目时,要有表单设计器.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的代码更改还是可以添加的内容?如果是代码更改,则必须指出代码更改的位置,并且我可以查看进行必要的更新。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您可以尝试创建源组:

source_group(Resources FILES Form1.resX)

但这肯定无济于事

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

答案 2 :(得分:0)

现在在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})

当没有root命名空间时它可以工作!

但是当文件在某个命名空间下时,我会遇到麻烦,例如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学到了这一点。这就是全部!