有没有办法全局宣布#define?
就像我想拥有一个例如
的文件一样#define MONO
我希望所有源代码文件都知道这个预处理器指令已经定义。我将如何实现这一目标?
答案 0 :(得分:33)
更新:您不能在“解决方案范围”定义afaik,但下面的答案在每个项目的基础上是可行的。
您可以在编译属性或构建选项中设置它们:
http://msdn.microsoft.com/en-US/library/76zdzba1(v=VS.80).aspx(VS2008) http://msdn.microsoft.com/en-US/library/76zdzba1(v=VS.100).aspx(VS2010)
请参阅“设置自定义常量”标题。
<强>更新强>
Microsoft Documentation on Build Options
右键单击项目并从菜单中选择属性,即可进入构建选项。
答案 1 :(得分:8)
我知道C#项目的解决方案(我没有在其他任何项目中对其进行过测试)
例如,您有
Project1\
Project2\
Solution1\Solution1.sln
Solution2\Solution2.sln
在解决方案目录中创建SolutionDefines.targets
文件
Project1\
Project2\
Solution1\Solution1.sln
Solution1\SolutionDefines.targets
Solution2\Solution2.sln
Solution2\SolutionDefines.targets
Solution3\Solution2.sln
Solution3\|no target file|
在每个项目文件中添加:
<Import Project="$(SolutionDir)SolutionDefines.targets" Condition="exists('$(SolutionDir)SolutionDefines.targets')" />
在Solution1\SolutionDefines.targets
中添加:
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<DefineConstants>$(DefineConstants);TRACING_BUILD</DefineConstants>
</PropertyGroup>
</Project>
在Solution2\SolutionDefines.targets
中添加:
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<DefineConstants>$(DefineConstants);ANOTHER_DEFINE</DefineConstants>
</PropertyGroup>
</Project>
在这种情况下,您有:
对于解决方案1-所有项目都添加了TRACING_BUILD
定义
对于Solution2-所有项目都添加了ANOTHER_DEFINE
定义
对于Solution3-所有项目-未添加定义
在这种方法中,必须将具有解决方案范围定义的所有解决方案存储在单独的目录中
答案 2 :(得分:4)
我认为没有办法创建解决方案范围的 #define。您可以为每个项目/程序集创建一个,如其他答案所述,但如果您需要所有源代码文件,则需要为解决方案中的每个项目执行此操作#define。
答案 3 :(得分:1)
在Configuration Manager中创建新的解决方案配置,并确保选中该框以创建新的项目配置。然后在每个项目的 Build 属性中,将MONO
输入条件编译符号框。
答案 4 :(得分:1)
在vs 2013中,您可以使用/ define:x或/ d:x http://msdn.microsoft.com/en-us/library/0feaad6z.aspx
答案 5 :(得分:1)
还有另一种解决方法,如果我错了,请纠正我:
例如,ProjectA
引用ProjectB
,而ProjectsCommon
包含基本静态变量。两个项目都引用ProjectsCommon
。
ProjectsCommon
中的代码:
[assembly: InternalsVisibleTo("ProjectA")]
------------------------------------------
public class ConditionVariables
{
public static bool IsABC { get; internal set; } = false;
}
ProjectA
中的代码:
#if ABC
ProjectsCommon.ConditionVariables.IsABC = true;
#endif
ProjectB
中的代码:
if (ProjectsCommon.ConditionVariables.IsABC )
{
// first scenario
}
else
{
// second one
}
但是,ProjectA
中的代码应首先运行。当ProjectA
是bootstarapper项目时,这可能很好。
答案 6 :(得分:1)
答案 7 :(得分:0)
我不知道解决方案范围的定义,但是通过执行以下操作,我能够快速向所有项目添加预处理器定义:
Properties
C/C++
-> Preprocessor
Preprocessor Definitions
旁边的小向下箭头<Edit...>
<different options>
之后添加我的定义OK
退出菜单我正在使用带有C代码库的Visual Studio Community 2019。
答案 8 :(得分:0)
几年后,与Alexei的答案类似,但先天得到支持
根据
,可以制作类似于Directory.Build.props
文件的NuGet.Config
https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build?view=vs-2019
我们的样子:
<Project>
<PropertyGroup>
<DefineConstants>RC_427</DefineConstants>
</PropertyGroup>
</Project>
它有效地将其包含在您的SLN中的所有CSPROJ文件中。由于某种原因,通过Google很难找到特定的解决方案。自MSBuild 15起出现
答案 9 :(得分:0)
如果解决方案中同时有C#和C ++项目,并且需要在它们之间共享预处理器定义。
如下在SolutionDefines.targets
附近创建一些*.sln
文件
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<DefineConstants>$(DefineConstants);MY_DEFINITION</DefineConstants>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<PreprocessorDefinitions>MY_DEFINITION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
</ItemDefinitionGroup>
</Project>
然后将这行代码添加到C / C ++ / C#*.vcproj
/ *.vcxproj
/ *.csproj
项目的末尾
<Import Project="$(SolutionDir)SolutionDefines.targets" Condition="exists('$(SolutionDir)SolutionDefines.targets')" />
好的,现在您可以在C#中享用#if MY_DEFINITION
,在C / C ++中享用#ifdef MY_DEFINITION
。 Visual Studio C#编辑器不喜欢这种方式,并告诉您没有定义MY_DEFINITION
。但是,C#编译器csc.exe可以正确获取符号。
答案 10 :(得分:-1)
预处理器指令的正确位置是VS构建配置。如果您使用命令行来构建解决方案,还可以使用/ define选项传递它。