9

Bir C++ kitaplığı yapıyorum (üstbilgiler kümesi, içe aktarma kitaplıkları ve DLL dosyaları). Bu kütüphaneyi kullanmak isteyen herhangi bir geliştirici için olabildiğince kolay hale getirmek istiyorum. Özellikle de, bu kütüphanenin tüketicilerinin, projelerinin tüm farklı konfigürasyonları için manuel olarak başlık yollarını, kütüphane yollarını ve link kütüphanelerini manuel olarak değiştirme konusunda endişelenmelerini istemiyorum (Debug | Release ve x86/x64/ARM). Bunu özellik sayfaları kullanarak yapabileceğimi biliyorum. Bu amaçla 6 farklı özellik sayfası oluşturdum (her yapılandırma için bir tane).Bir C++ kitaplığı kullanımını kolaylaştırmak için bir Visual Studio özellik sayfası oluşturma

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

ben bunun mümkün olabilir sadece tek sahne dosyası oluşturmak için bilmek istiyorum: | (makrolar INCLUDEPATH ve LIBPATH doğru tanımlandığından varsayalım, ayıklama sürümünü sadece x86 listeleme) Her sayfa aşağıda benziyor Kullanıcının aktif yapılandırması ne olursa olsun tüm 6 konfigürasyona dikkat edin. Bu dosya nasıl görünüyor? Sadece gibi bir yapı içinde kütüphane ikilileri yükleyebilir

+1

Birisi standart "Sürüm" ve "Hata Ayıklama" yapılandırmalarından daha fazlasını tanımlamanın mümkün olduğunu (muhtemelen olası) unutmayın. Örneğin, bir .dll oluşturmaya karşı statik bir kitaplık oluşturmak arasında ayrım yapmak için özel yapılandırmalar tanımlayan birkaç proje biliyorum. –

+0

@BillyONeal Sure. Kütüphanem için varsayılan iki "Hata Ayıkla" ve "Sürüm" ü desteklemekten memnuniyet duyarım. Bu mallar için yeni bir şeyim. Bu 6 kombinasyon için nasıl görüneceğini biliyor musun? –

+1

Hmm, bir süre önce böyle bir şey yaptım. Yarın bakmayı hatırlamaya çalışacağım. Gerçekleştirmenin anahtarı, bunların gerçekten sadece MSBuild dosyaları olmasıdır. Ve basit MSBuild'deki koşulları iyi yapabilirsiniz (ancak sözdizimini kapalı olarak hatırlayamıyorum). Yapılandırmalarını (hata ayıklama/bırakma) platformdan ayrı ayrı ele almaya başladığımda özellik tablolarımın çok daha basit olduğunu fark ettim. Bunun yerine, aptalca "her iki dizede bir araya getirin ve sonra da yapı ayarlarını belirle" ifadesini kullanın. VS proje dosyalarında varsayılan olarak. :) – jalf

cevap

3

:

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

Ve sonra sadece tek bir proje çapında sahne oluşturmak böyle dosyası:

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

size istemek durumunda INCLUDEPATH ve LIBPATH değişkenlerini kayıt defterinden okunan bilgilerle değiştirebilirsiniz (kurulum sırasında koyabilirsiniz):

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