在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的代码更改还是可以添加的内容?如果是代码更改,则必须指出代码更改的位置,并且我可以查看进行必要的更新。
答案 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学到了这一点。这就是全部!