创建Visual Studio属性表以简化C++库的使用

Creating a Visual Studio property sheet to ease the use of a C++ library

本文关键字:C++ Studio Visual 属性 创建      更新时间:2023-10-16

我正在构建一个C++库(一组头、导入库和DLL)。我想让任何想使用这个库的开发人员都能尽可能轻松地使用它。特别是我不希望这个库的使用者不得不担心为他们项目的所有不同配置手动更改头路径、库路径和链接库(Debug|Release和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);$LIBPATHx86Debug</AdditionalLibraryDirectories>
      <AdditionalDependencies>MyCPPLib.lib;$(AdditionalDependencies)</AdditionalDependencies>
    </Link>
  </ItemDefinitionGroup>
</Project>

我想知道是否可以创建一个单独的道具文件,根据用户的活动配置来处理所有6种配置?那个文件会是什么样子?

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

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

然后只需创建一个项目范围内的道具文件,如下所示:

<?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_MACHINESoftwareMyCompanyMySDKv1`, `InstallDir`))INCLUDE;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>