9

Buduję bibliotekę C++ (zestaw nagłówków, bibliotek importu i bibliotek DLL). Chcę, aby korzystanie z tej biblioteki było jak najprostsze dla każdego programisty, który chce z niej korzystać. Szczególnie nie chcę, aby konsumenci tej biblioteki musieli się martwić o zmianę ścieżek nagłówka, ścieżek bibliotek i bibliotek łączy ręcznie dla wszystkich różnych konfiguracji ich projektu (Debug | Release i x86/x64/ARM). Wiem, że mogę to zrobić za pomocą arkuszy właściwości. W tym celu utworzyłem 6 różnych arkuszy właściwości (po jednym dla każdej konfiguracji). Każdy arkusz wygląda jak poniżej (wymieniając tylko x86 | wersję Debug załóżmy, że INCLUDEPATH makra i LIBPATH są prawidłowo zdefiniowane):Tworzenie arkusza właściwości Visual Studio w celu ułatwienia korzystania z biblioteki C++

<?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> 

Chcę wiedzieć, czy jest możliwe, aby utworzyć tylko jeden plik rekwizyty, które mogą zajmiesz się wszystkimi 6 konfiguracjami opartymi na jakiejkolwiek aktywnej konfiguracji użytkownika? Jak by ten plik wyglądał?

+1

Należy pamiętać, że jest możliwe (a nawet prawdopodobne), że ktoś zdefiniuje więcej niż standardowe konfiguracje "Release" i "Debugowanie". Znam kilka projektów, które definiują niestandardowe konfiguracje w celu rozróżnienia między budowaniem biblioteki statycznej a budowaniem pliku .dll, na przykład. –

+0

@BillyONeal Pewnie. Byłbym szczęśliwy, gdyby poprzeć domyślne dwie "Debugowanie" i "Release" dla mojej biblioteki. Jestem nowy w tym arkuszu właściwości. Czy wiesz, jak by to wyglądało w przypadku tych sześciu konopi? –

+1

Hmm, coś takiego zrobiłem jakiś czas temu. Spróbuję pamiętać, żeby jutro to sprawdzić. Kluczem do zrozumienia jest to, że są to po prostu pliki MSBuild. I możesz zrobić warunki w zwykłym MSBuildzie w porządku (ale nie pamiętam składni off-hand). Zauważyłem, że moje arkusze właściwości stały się o wiele prostsze, gdy zacząłem traktować konfigurację kompilacji (debugowanie/wydawanie) oddzielnie od platformy, a nie głupie "łączenie obu w jeden ciąg, a następnie używanie tego do określania ustawień kompilacji", która istnieje w plikach projektu VS domyślnie. :) – jalf

Odpowiedz

3

Wystarczy zainstalować pliki binarne biblioteki w strukturze, takie jak:

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

a następnie wystarczy utworzyć pojedyncze rekwizyty całego projektu plik tak:

<?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> 

Jeśli chcesz, można zastąpić zmienne INCLUDEPATH i LIBPATH informacjami odczytanymi z rejestru (gdzie można je umieścić podczas instalacji):

<ClCompile> 
     <AdditionalIncludeDirectories>$([MSBuild]::GetRegistryValue(`HKEY_LOCAL_MACHINE\Software\MyCompany\MySDK\v1`, `InstallDir`))\INCLUDE;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> 
</ClCompile> 
Powiązane problemy