[VS11] Projekteigenschaftsblaetter - CRT-Link-Art



  • Hi Leute,
    ich habe heute mal mein Boost geupdatet auf die aktuellste Version und wollte es mir diesesmal etwas einfacher machen, was dessen Benutzung angeht. Bisher hatte ich immer einfach --build-type=complete gemacht und musste dann aber fuer jede Konfiguration jeweils den Namen der Import-Libs aendern. Das war nervig, insbesondere, wenn man eine Library hinzufuegen musste und 4 verschiedene Build-Configurationen hatte - von der Mehrarbeit bei einem boost-Update ganz zu schweigen.

    Um mir das ganze jetzt zu erleichtern habe ich ein Build-Skript fuer Boost erstellt, was automatisch alle von mir benoetigten Konfigurations- und Platform-Varianten kompiliert und in seperate Verzeichnisse packt. Und den layout -Parameter hab ich auf system eingestellt, um durchgaengig gleiche Namen zu haben.

    Jetzt muesste ich ja aber fuer jede Build-Konfiguration die Verzeichnisse von Hand aendern... Momentan habe ich das Problem mit folgendem Eigenschafts-Blatt geloest:

    <?xml version="1.0" encoding="utf-8"?> 
    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup Label="Globals">
        <IncludePath>$(BOOST_ROOT)\include;$(IncludePath)</IncludePath>
      </PropertyGroup>
      <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
        <LibraryPath>$(BOOST_ROOT)\lib86\crtd\debug;$(LibraryPath)</LibraryPath>
      </PropertyGroup>
      <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
        <LibraryPath>$(BOOST_ROOT)\lib64\crtd\debug;$(LibraryPath)</LibraryPath>
      </PropertyGroup>
      <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
        <LibraryPath>$(BOOST_ROOT)\lib86\crtd\release;$(LibraryPath)</LibraryPath>
      </PropertyGroup>
      <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
        <LibraryPath>$(BOOST_ROOT)\lib64\crtd\release;$(LibraryPath)</LibraryPath>
      </PropertyGroup>
    </Project>
    

    Mein Problem ist, dass diese Variante bisher immer die Boost-Libs, die dynamisch gegen die CRT linken waehlt. So kann ich ja schlecht statisch im Projekt dagegen linken. Ich weiss nicht, ob das ueberhaupt linken wuerde, aber selbst wenn: Ich muesste unbedingt die CRT wieder extra mitgeben.

    Gibt es eine Moeglichkeit innerhalb von Projekt-Eigenschaftsblaettern die Konfiguration zu pruefen, ob dynamisch oder statisch gegen die CRT gelinkt wird?
    So dass man also das Eigenschaftsblatt dahingehend umschreiben koennte, dass abhaengig davon $(BOOST_ROOT)\libXX\crtD/S\debug verwendet?

    Danke im voraus.



  • i.d.R. wird sowas dadudrch gemacht, dass man im Code in #ifdef macht und dann jeweils die passende LIB angibt, welche dann das passende Format hat. Die LIB muss sich dann natürlich im Dateinamen unterscheiden...

    Also z.B.

    #ifdef _MT
    #pragma comment(lib, "LIB_MT.lib")
    #else
    #pragma comment(lib, "MIB_MD.lib")
    #endif
    

    Beide LIBs liegen im gleichen Pfad und somit wird immer die passende gefunden...
    Es gibt dann noch ergänzungen bzgl. Debug/Release und/oder Ansi/Unicode...

    #ifdef _MT
     #ifdef _UNICODE
      #ifdef _DEBUG
       #pragma comment(lib, "LIB_MTdu.lib")
      #else
       #pragma comment(lib, "LIB_MTu.lib")
      #endif
     #else
      #ifdef _DEBUG
       #pragma comment(lib, "LIB_MTd.lib")
      #else
       #pragma comment(lib, "LIB_MT.lib")
      #endif
     #endif
    #else
     #ifdef _UNICODE
      #ifdef _DEBUG 
       #pragma comment(lib, "MIB_MDdu.lib")
      #else
       #pragma comment(lib, "MIB_MDu.lib")
      #endif
     #else
      #ifdef _DEBUG 
       #pragma comment(lib, "MIB_MDd.lib")
      #else
       #pragma comment(lib, "MIB_MD.lib")
      #endif
     #endif
    #endif
    

Anmelden zum Antworten