release library in debug verwenden



  • Hallo

    die eigentliche Frage lautet wie kann ich eine "release" lib in einer Anwendung verwenden die mit "debug" gebildet wird.

    Hintergrund:

    Habe mir von github eine mqtt library runtergeladen:
    https://github.com/eclipse/paho.mqtt.cpp/releases
    Version 1.0.1

    Hierzu habe ich mit der Anleitung readme.md (ziemlich hoperig) eine Visual Studio Solution erzeugt.
    Mit dieser Solution lässt sich dann die benötigte paho-mqttpp3-static.lib erstellen.

    Ich möchte mir nun ein nugetpackage erstellen um die library in unserem Haus verteilen zu können. Dazu erstelle ich mir die paho-mqttpp3-static.lib mit der Configuration "release". und lege diese im nugetpackage ab.

    Verwende ich nun aber diese lib in meinem Projekt und kompiliere mit debug erhalte ich die Fehler:

    Error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Communication.obj
    Error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MDd_DynamicDebug' in Communication.obj

    Ich könnte mir nun natürlich eine release und eine debug Variante erstellen und dann diese in abhängigkeit meiner Configuration laden.

    Die Frage ist aber geht das auch anders? Eigentlich möchte ich ja in meinem nugetpaket keine debug version ausliefern.



  • Dingstis zusammenlinken die gegen unterschiedliche Versionen der CRT gelinkt sind nix gut Idee. Kann gut gehen. Kann schiefgehen. Kann plötzlich aufhören gut zu gehen. Related.

    @booster sagte in release library in debug verwenden:

    Eigentlich möchte ich ja in meinem nugetpaket keine debug version ausliefern.

    Was täte so weh daran?



  • hallo swordi

    Dingstis wa isch au des? 🙂

    @Swordfish sagte in release library in debug verwenden:

    Was täte so weh daran?

    Weiß auch nicht. Nugetpakete kommen ja ursprünglich aus dem c# bereich. Dort habe ich noch nie gesehen dass jemand debug dlls mit ausgeliefert hätte.

    In c++ gibt es die boost library auch als nuget package. Dort wird auch keine debug mit ausgeliefert. Also irgendwie klappt es dort ja auch.



  • Naja bei C# gibt es nicht die starke unterscheidung zwischen debug und release für die runtime wie bei der C++ runtime unter windows.
    Wobei das nur eine spezialität unter Windows ist das es eine debug und eine release c++ runtime gibt.



  • @firefly

    c# -> Ok.
    Aber Wie löst das dann boost bei c++?


  • Administrator

    @booster sagte in release library in debug verwenden:

    In c++ gibt es die boost library auch als nuget package. Dort wird auch keine debug mit ausgeliefert. Also irgendwie klappt es dort ja auch.

    Doch, es wird eine Debug-Version mitausgeliefert. Das Package boost sind nur die header-only Bibliotheken. Für die kompilierten gibt es jeweils eigene Pakete (z.B. boost_log-vc141). Wenn du dir die Zip-Datei anschaust, siehst du, dass es alle möglichen Varianten inklusiv der Debug-Versionen enthält.



  • @Dravere sagte in release library in debug verwenden:

    Das Package boost sind nur die header-only Bibliotheken. Für die kompilierten gibt es jeweils eigene Pakete.

    Ja ok das weiß ich. Ich habe mir das paket boosl_locale-vc141 runtergeladen.

    da sind dann libs drin

    boost_locale-vc141-mt-gd-x32-1_70.lib
    boost_locale-vc141-mt-gd-x64-1_70.lib
    boost_locale-vc141-mt-x32-1_70.lib
    boost_locale-vc141-mt-x64-1_70.lib

    ah ok gerade gegoogelt
    mt = multi threaded
    und das gd steht für debug.

    Danke für den Hinweis:

    Aber:

    In meiner targets file musste ich aber noch die Abhängigkeit zu dieser Lib angeben.

    <Link>
         <AdditionalLibraryDirectories>$(MSBuildThisFileDirectory)..\lib\native\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
         <AdditionalDependencies>paho-mqttpp3-static.lib;%(AdditionalDependencies)</AdditionalDependencies>
    </Link>
    

    Die lib heißt bei mir in beiden Fällen gleich. Ich habe dann zwei Ordner erstellt Debug und Release und <AdditionalLibraryDirectories> dann halt den richtigen Pfad über das Marko $(Configuration) gesetzt.

    In boost heißen die debug und die release variante anders. Ebenfalls wird darin ja noch die Plattform unterschieden.

    Im targets file ist nur der Pfad zum Library Diretory angegeben ohne Angabe der dependencies:

    <Link>
         <AdditionalLibraryDirectories>$(MSBuildThisFileDirectory)..\lib\native\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
    </Link>
    

    Worin wird jetzt unterschieden welche lib verwendet werden soll. Erkennt das der Linker selbst?



  • @booster sagte in release library in debug verwenden:

    Erkennt das der Linker selbst?

    Ne, cl kann nicht Hellsehen. Noch nicht. Angeblich ist das für v17 geplant.



  • @Swordfish sagte in release library in debug verwenden:

    Noch nicht. Angeblich ist das für v17 geplant

    Ok aber wie gesagt ist bei boost die AdditionalDependencie. nicht angegeben

    Liegt das eventuell daran dass boost .dlls mit auslifert die library also dynamisch und nicht statisch gelinkt wird.


  • Administrator

    @booster Boost macht das automatisch über den Pre-Processor mit einer Erweiterung für Visual Studio. Um genau zu sein mit #pragma comment(lib, "<name der lib>"). Siehe auch hier: https://docs.microsoft.com/en-us/cpp/preprocessor/comment-c-cpp#lib

    Wenn du es Plattform unabhängig machen willst, dann musst du es in der Debug-, bzw. Release-Konfiguration jeweils angeben. Also entweder welche Library verwendet wird oder wie der Name lauten soll.


Log in to reply