在C#项目中,文件有一个名为复制到输出目录的属性。但是在VC++项目中,该属性不存在。我知道,在VC++中可以使用生成事件,然后在那里编写类似以下内容的代码:
xcopy /y /d %(FullPath) $(OutDir)
有没有一种方法可以避免使用CMD(和其他脚本方法)?msbuild能在这种情况下提供帮助吗?
在C#项目中,文件有一个名为复制到输出目录的属性。但是在VC++项目中,该属性不存在。我知道,在VC++中可以使用生成事件,然后在那里编写类似以下内容的代码:
xcopy /y /d %(FullPath) $(OutDir)
有没有一种方法可以避免使用CMD(和其他脚本方法)?msbuild能在这种情况下提供帮助吗?
MSBuild能在这种情况下提供帮助吗?
我使用 MSVC 2012,以下方法适用:
假设你的 C++ 项目中有一个名为 "Data/ThisIsData.txt" 的文件。
先卸载项目(右键单击 --> 卸载项目)。
编辑项目 XML 文件(右键单击 --> 编辑 .vcxproj 文件)
现在你可以在编辑器中以 XML 格式看到项目的 MSBuild 文件。
找到 "ThisIsData.txt"。它应该长成这个样子:
<ItemGroup>
<None Include="Data\ThisIsData.txt" />
...
</ItemGroup>
现在添加另一个类似于这样的项目组:
<ItemGroup>
<Content Include="Data\ThisIsData.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
...
</ItemGroup>
重新加载项目并构建。
你的文件"ThisIsData.txt"应该会被复制到$(OutDir)\Data\ThisIsData.txt。
为什么要重复ItemGroup?
如果你只是将None include更改为content include,IDE似乎不再喜欢它,并且不会显示它。因此为了保持数据文件的快速编辑选项,我决定保留重复的条目。
<ItemGroup>
<CopyFileToFolders Include="Filename.txt">
<DeploymentContent>true</DeploymentContent>
<FileType>Document</FileType>
</CopyFileToFolders>
</ItemGroup>
在VS 2015中,可以为C语言项目添加与C#相同的功能。(灵感来自于jochen的回答。) 不需要添加另一个ItemGroup,只需修改给定的ItemGroup并添加CopyTo元素即可。例如,在使用他的示例时,只需增强原始条目:
<ItemGroup>
<None Include="Data\ThisIsData.txt" />
<DeploymentContent>true</DeploymentContent>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
...
</ItemGroup>
无需其他ItemGroup。通过添加CopyTo元素,您可以添加“包含在项目中”属性。
Items outside Target elements must have one of the following operations: Include, Update or Remove. [vcxproj filename]
,我的代码是:<ItemGroup> <None Include="..\IncludedLibraries\jpeglib\libjpeg-9.dll" /> <DeploymentContent>true</DeploymentContent> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </ItemGroup>
- Draex_这取决于您使用的Visual Studio版本。在Visual Studio 2008中,VC++项目文件的格式不是MSBuild,因此在PostBuildStep中使用xcopy是一个不错的选择。
在Visual Studio 2010中的VC++项目具有MSBuild格式。 因此,有MSBuild Copy任务的功能。
下面是一个示例:
<Copy
SourceFiles="%(FullPath)"
DestinationFolder="$(OutDir)"
/>
如果目标目录不存在,它会被自动创建。在 henri-socha's answer 关于 VS2015(可能也包括 VS2013 和 VS2012,或者任何使用 MSBuild 样式项目的工具)中,ItemGroup 项类型很重要。
具体来说,<Text>
项不会被复制,而 <Content>
项会被复制。
因此,如果一个项目目录 Data 包含一个文本文件 ThisIsData.txt,那么这将在 $(OutDir)
目录下创建一个子目录 Data,并将该文件从项目中复制到该目录下(如果文件是新的):
<ItemGroup>
<Content Include="Data\ThisIsData.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
尽管这是Visual Studio IDE将文本文件添加到项目并设置Content
属性为True
时插入的内容,但它不会起作用。
<ItemGroup>
<Text Include="Data\ThisIsData.txt">
<DeploymentContent>true</DeploymentContent>
</Text>
</ItemGroup>
In the
*.vcxproj
file, change:<Text Include="Filename.txt" />
to:
<Content Include="Filename.txt"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content>
Then in the
*.vcxproj.filters
file, change:<Text Include="Filename.txt"> <Filter>Resource Files</Filter> </Text>
to:
<Content Include="Filename.txt"> <Filter>Resource Files</Filter> </Content>
其中<Text ...>
标签用于指定文本文件(对于图像文件等,将使用<Image ...>
)
.vcxproj.filters
文件,而2017年修改了。 - Vertigo