[英]Solution-wide #define
有沒有辦法全局聲明#define?
就像我想要一個文件,例如,
#define MONO
我希望所有源代碼文件都知道這個預處理器指令已定義。 我將如何實現這一目標?
更新:您不能在“解決方案范圍內”定義 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)
請參閱“設置自定義常量”標題。
更新
您可以通過右鍵單擊項目並從菜單中選擇屬性來訪問構建選項。
我知道 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
定義
對於解決方案 2 - 所有項目都添加了ANOTHER_DEFINE
定義
對於解決方案 3 - 所有項目 - 沒有添加定義
在這種方法中,您必須將具有解決方案范圍定義的所有解決方案存儲在單獨的目錄中
多年后,與阿列克謝的回答相似,但天生支持
可以根據以下內容制作類似於NuGet.Config
文件的Directory.Build.props
https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build?view=vs-2019
我們的看起來像:
<Project>
<PropertyGroup>
<DefineConstants>RC_427</DefineConstants>
</PropertyGroup>
</Project>
它有效地將其包含在您的 SLN 中的所有 CSPROJ 文件中。 出於某種原因,通過谷歌很難找到特定的解決方案。 自 MSBuild 15 以來一直存在
我認為沒有辦法創建解決方案范圍的#define。 您可以為每個項目/程序集創建一個,正如其他答案所描述的那樣,但是如果您需要所有源代碼文件都知道#define,則需要為解決方案中的每個項目都這樣做。
在 vs 2013 中,您可以使用 /define:x 或 /d:x http://msdn.microsoft.com/en-us/library/0feaad6z.aspx
在 Configuration Manager 中創建新的解決方案配置,並確保選中該框以創建新的項目配置。 然后在每個項目的構建屬性中,在條件編譯符號框中輸入MONO
。
還有一種解決方法,如果我錯了,請糾正我:
例如, 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 項目時,這可能很好。
預處理器指令的正確位置是 VS 構建配置。 如果您使用命令行來構建您的解決方案,您還可以使用 /define 選項傳遞它。
我不知道解決方案廣泛的定義,但我能夠通過執行以下操作快速向所有項目添加預處理器定義:
Properties
C/C++
--> Preprocessor
Preprocessor Definitions
旁邊的小向下箭頭<Edit...>
<different options>
之后添加我的定義OK
退出菜單我正在使用帶有 C 代碼庫的 Visual Studio Community 2019。
如果您在解決方案中有 C# 和 C++ 項目並且需要在它們之間共享預處理器定義。 在您的*.sln
附近創建一些SolutionDefines.targets
文件,如下所示
<?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 正確獲取符號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.