Statische Bibliothek mit Visual C++ 2008
-
Ich versuche eine statische Bibliothek für Visual C++ 2008 zu bauen.
Das bauen der Library sieht auf der Commandozeile ungefähr (natürlich mit mehr Dateien) so aus:
cl /Fomain.obj /c main.cpp /TP /nologo /EHsc /MD /O2 main.cpp lib /nologo main.obj
Wenn ich diese Library dann in ein Projekt einbinde klappt auch alles - solange ich als Release baue! Sobald ich auf Debug umschalte, stürzt das Programm mit undefinierten Verhalten und einem Speicherzugriffsfehler ab. Vorher gibt's diese Warnungen:
1>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library 1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
Befolge ich den Hinweis und füge die Beide /NODEFAULTLIB-Befehle erhalte ich:
error LNK2001: unresolved external symbol __imp___invalid_parameter_noinfo
Ich vermute mal, dass es daran liegt, dass die Bibliothek mit /MD gebaut wurde und das spätere Programm dann mit /MDd. Wie kann ich eine statische Bibliothek bauen, die später auch in einen Debug-Build gelinkt werden kann?
-
Du musst immer für Debug und Release unterschiedliche Libs bauaen, denn die CRT Versionen sind unterschiedlich.
Du hast übrigends den Hinweis nicht korrekt gelesen. /NODEFAULTLIB ist keine Lösung nihct für Dich.
Kortrekt ist es den Konflikt aufzulösen, denn Dein Programm will die Debug CRT-Libsund Deine LIB die Release-CRT-Libs.
Diesen Konflikt wirst Du nicht los indem Du die Warnung ignorierst.Korreekt wäre es den Konflikt mit VERBOSE:LIB zu finden!
-
Martin Richter schrieb:
Du musst immer für Debug und Release unterschiedliche Libs bauaen, denn die CRT Versionen sind unterschiedlich.
Ah okay. Wie kommt es aber, dass bei vielen Libaries (z.B. libpng, freetype, etc.) trotzdem nur eine .lib Datei gebraucht wird?
-
Weil das evtl. reine Import-Bibliotheken sind die nur eine DLL bedienen und keinen statischen Code-Libs!
-
Hm ... ne ich davon auch ne statische .lib, die benötigt keine .dll mehr.
Was mir auch noch aufgefallen ist: Je nachdem ob man mit /MT oder /MD kompiliert, benötigt man auch ein spezielle Version der statischen Bibliothek. Das würde bedeuten, dass ich meine statische Bibliothek ganze vier Mal (/MT /MD /MTd /MDd) kompilieren müsste. Das kann doch nicht sein, oder?