11

我正在构建一个 C++ 库(一组头文件、导入库和 DLL)。我想让任何想要使用它的开发人员尽可能轻松地使用这个库。特别是我不希望这个库的使用者不得不为他们项目的所有不同配置(调试|发布和 x86/x64/ARM)手动更改头文件路径、库路径和链接库。我知道我可以使用属性表来做到这一点。为此,我创建了 6 个不同的属性表(每个配置一个)。每张表如下所示(仅列出 x86|Debug 版本,假设宏 INCLUDEPATH 和 LIBPATH 已正确定义):

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <_PropertySheetDisplayName>MyCPPLib, 1.0</_PropertySheetDisplayName>
  </PropertyGroup>
  <ItemDefinitionGroup>
    <ClCompile>
      <AdditionalIncludeDirectories>$INCLUDEPATH;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    </ClCompile>
    <Link>
      <AdditionalLibraryDirectories>$(AdditionalLibraryDirectories);$LIBPATH\x86\Debug</AdditionalLibraryDirectories>
      <AdditionalDependencies>MyCPPLib.lib;$(AdditionalDependencies)</AdditionalDependencies>
    </Link>
  </ItemDefinitionGroup>
</Project>

我想知道是否可以根据用户的活动配置创建一个可以处理所有 6 个配置的单个 props 文件?该文件的外观如何?

4

1 回答 1

7

您可以将库二进制文件安装在以下结构中:

<toplevelsdkdir>
  |-> lib
       |-> x86
            |-> Debug
            |-> Release
       |-> x64
            |-> Debug
            |-> Release

然后像这样创建一个项目范围的 props 文件:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <_PropertySheetDisplayName>MyCPPLib, 1.0</_PropertySheetDisplayName>
  </PropertyGroup>
  <ItemDefinitionGroup>
    <ClCompile>
      <AdditionalIncludeDirectories>$INCLUDEPATH;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    </ClCompile>
    <Link>
      <AdditionalLibraryDirectories>$(AdditionalLibraryDirectories);$LIBPATH\$(PlatformTarget)\$(Configuration)</AdditionalLibraryDirectories>
      <AdditionalDependencies>MyCPPLib.lib;$(AdditionalDependencies)</AdditionalDependencies>
    </Link>
  </ItemDefinitionGroup>
</Project>

如果您愿意,可以将变量 INCLUDEPATH 和 LIBPATH 替换为从注册表中读取的信息(您可以在安装期间将其放置在其中):

<ClCompile>
      <AdditionalIncludeDirectories>$([MSBuild]::GetRegistryValue(`HKEY_LOCAL_MACHINE\Software\MyCompany\MySDK\v1`, `InstallDir`))\INCLUDE;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
于 2013-02-21T18:52:54.197 回答