【问题标题】:Include path relative to props file in visual studio在 Visual Studio 中包含相对于 props 文件的路径
【发布时间】:2017-11-07 05:41:49
【问题描述】:

我正在尝试创建包含路径的属性文件,以便在我的所有 c++ 项目中使用。

这是存储库结构。

/
    /Libs
        /Libs2
            A.h
         B.h
    /Sln1
        Sln1.sln
        Proj1.vcxproj
    Sln2.sln
    Proj2.vcxproj
    Props.props

我想使用属性文件 (Props.props) 将以下包含路径添加到两个项目 (C:\\Libs;C:\\Libs\Libs2)。

目前我的属性文件中有宏:

Name          Value
ProjRoot      C:\<path to rep root>

我在包含字符串中使用它:$(ProjRoot)\Libs;$(ProjRoot)\Libs\Libs2

此解决方案的问题是宏值中的硬编码绝对路径。如果我的存储库将被克隆到另一个驱动器上,我将不得不手动更改它。

我可以在宏值中使用相对于属性文件的路径吗?

即:

Name          Value
ProjRoot      ./

./ 将在所有将使用此属性文件的项目中解析为 Props.props 文件的路径。

我不能使用 $(SolutionDir) 和 $(ProjectDir) 因为可能存在不同嵌套级别的解决方案和项目,因此相对于它们的路径不起作用。

谢谢。

【问题讨论】:

    标签: c++ visual-studio visual-c++ include-path


    【解决方案1】:

    这样做应该手动编辑道具文件并包括以下内容:

    <PropSheetPath>$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)'))</PropSheetPath>
    

    这将使用属性文件夹创建属性PropSheetPath

    在这里找到答案:

    https://social.msdn.microsoft.com/Forums/vstudio/en-US/2817cae7-3a71-4701-839a-9bf47af7c498/property-sheets-macro-to-reference-location-of-property-sheet?forum=vcgeneral

    【讨论】:

      【解决方案2】:

      只是为了改进以前的答案...这里是一个完整的示例(我正在使用一堆小的属性表以模块化方式添加第三方库)。这是添加路径以包含 C++ 编译器的文件夹和链接器的库文件夹以将 CEGUI 库添加到项目中的示例(调试版本,我使用单独的属性表进行发布)。

      <?xml version="1.0" encoding="utf-8"?>
      <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <ImportGroup Label="PropertySheets" />
        <PropertyGroup Label="UserMacros">
          <PropSheetPath>$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)'))</PropSheetPath>
        </PropertyGroup>
        <PropertyGroup Condition="'$(Language)'=='C++'">
          <CAExcludePath>$(PropsheetPath)..\..\install\windows\Debug\include\cegui-0;$(CAExcludePath)</CAExcludePath>
        </PropertyGroup>
        <ItemDefinitionGroup>
          <ClCompile>
            <PreprocessorDefinitions>CEGUI_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
            <AdditionalIncludeDirectories>$(PropsheetPath)..\..\install\windows\Debug\include\cegui-0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
          </ClCompile>
          <Link>
            <AdditionalLibraryDirectories>$(PropsheetPath)..\..\install\windows\Debug\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
            <AdditionalDependencies>DbgHelp.lib;CEGUIBase-0_Static_d.lib;CEGUICommonDialogs-0_Static_d.lib;CEGUICoreWindowRendererSet_Static_d.lib;CEGUIExpatParser_Static_d.lib;CEGUIOpenGLRenderer-0_Static_d.lib;CEGUITGAImageCodec_Static_d.lib;%(AdditionalDependencies)</AdditionalDependencies>
          </Link>
        </ItemDefinitionGroup>
        <ItemGroup />
      </Project>
      

      【讨论】:

      • 更新:不幸的是,如果项目包含多个声明此属性的属性表,这将不起作用:它的值会粘到列表中声明它的第一个属性表。因此,有两种解决方法: 1. 给这些用户宏赋予唯一的名称(例如附加属性表的名称),不太方便复制粘贴。 2. 只需使用$(MSBuildThisFileDirectory) 而不使用任何周围的代码,这对我来说完美无缺!
      猜你喜欢
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 2016-07-22
      • 2021-04-03
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      相关资源
      最近更新 更多