我正在尝试使用CMake生成Visual Studio C#项目。这是我到目前为止的内容:
cmake_minimum_required(VERSION 3.10)
project(myProject VERSION 0.1.0 LANGUAGES CSharp)
add_library(myLib SHARED
src/file1.cs
src/file2.cs
src/file3.cs)
set_property(TARGET myLib PROPERTY VS_DOTNET_TARGET_FRAMEWORK_VERSION "netstandard1.4")
我从用Visual Studio生成的.csproj文件中获得了框架名称,如下所示:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard1.4</TargetFramework>
</PropertyGroup>
</Project>
这是我为.NET Standard 1.4构建库所需要的。但是,CMake会生成此内容(以及其他所有内容):
<TargetFrameworkVersion>netstandard1.4</TargetFrameworkVersion>
这似乎无效,因为Visual Studio抱怨它无法打开项目。我在CMake文档中没有发现要设置<TargetFramework>
而不是<TargetFrameworkVersion>
的任何内容。这可能吗?
答案 0 :(得分:1)
这就是我设法正确生成项目的方式。当心,这是一个丑陋的hack。 在您采用这种方式之前,请先检查CMake是否已更新为正确支持此功能。
。因此,第一件事:VS_DOTNET_TARGET_FRAMEWORK_VERSION
是不必要的。要添加适当的<TargetFramework>
,可以使用以下行:
set_property(TARGET myLib PROPERTY VS_GLOBAL_TargetFramework "netstandard1.4")
您还想添加此内容,因为出于某些原因,CMake认为默认情况下以C#3作为语言级别生成一个项目是个好主意:
set_property(TARGET myLib PROPERTY VS_GLOBAL_LangVersion "6")
生成的项目将无法在Visual Studio中正确打开。这是因为.NET Core对CMake当前无法生成的csproj格式进行了一些更改。作为参考,this article涵盖了它们。 CMake无法正确生成它们,因此,我将首先告诉您您需要进行哪些修改,然后为您提供一些可修改的PowerShell脚本。
现在在根Sdk
上有一个属性<Project>
,我们需要这样设置:
<Project Sdk="Microsoft.NET.Sdk" ...
自动生成的ZERO_CHECK
项目无法正常工作,因此让我们摆脱它(我们并不需要它)。将其从<ProjectReference ... </ProjectReference>
中删除,如果只有它,则删除整个XML标签。
然后,由于该项目现在将自动引用SDK中的内容,因此我们需要摆脱对Microsoft.CSharp.targets
和Microsoft.Common.props
的引用。否则,Visual Studio将向您显示警告,并提示您多次加载了内容。只需删除包含这些字符串的行即可。
CMake始终生成的标准项目ALL_BUILD
和ZERO_CHECK
无法正常工作,我也不必费心去适当地修复它们,因为它们并不是必需的。我刚刚从.sln
文件中删除了它们。
就是这样!现在,您可以在Visual Studio中打开该项目,它将正常运行。
这是我编写的脚本,用于正确生成项目和解决方案。它在文件夹cmake-vs
中生成解决方案。您需要{。{1}}实用程序,它是.NET Core SDK的一部分。
请注意,路径可能无法移植。将dotnet
替换为您的库名。
myLib