PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ static lib + Visual Studio Problem


Expandable
2008-07-10, 15:58:44
Hallo,

ich versuche gerade, eine static library zu erstellen und in einem anderen C++-Projekt wieder einzubinden, scheitere dabei aber grandios.

Ich erstelle eine neue Solution, darin ein Win32 static library Projekt (empty). Ich füge eine Header- und eine Source-Datei ein, mit einer ganz simplen Klasse:

class Test
{ public: Test() { i = 10; }
int i;
int GetI() { return i; }
};

Ich erstelle ein zweites Projekt, füge die lib-File in den Linkersettings hinzu und erstelle in der Mainfunktion einen Pointer: Test* t = new Test(); int i = t->GetI();

Wenn ich im zweiten Projekt den Common Language Runtime support (/clr) aktiviere, gibt es keine Probleme. Wenn ich allerdings eine unmanaged Anwendung will, kommt beim Starten (egal ob Debug oder Release) der Fehler: "This application has failed to start because MSVCR90D.dll was not found. Re-installing the application may fix this problem". Das passiert auch unter Visual Studio 2005 Prof, genau das gleiche (auch dass es mit CLR geht).

Ich habe nun versucht, mit Multi-threaded Debug (/MTd) statt Multi-threaded Debug DLL (/MDd) zu compilen (sowohl die lib als auch die Anwendung). Resultat: Es wird gestartet. Wenn ich keinen Pointer auf das Objekt erstelle, funktioniert's auch bestens. Aber sobald ich new aufrufe, beendet sich die Anwendung ohne irgendeinen Fehler oder sonst etwas.

Ich habe jetzt schon Stunden im Internet gesucht, aber nichts gefunden, was mir weitergeholfen hat. Ich habe mich auch Wort für Wort an das MSDN-Tutorial für static libs gehalten. Es geht einfach nicht. Komisch ist, dass ich andere Projekte mit static libs problemlos compilen kann, bloß mein eigenes nicht.

Irgendeine Idee? Bin echt ratlos.

Danke.

Ectoplasma
2008-07-10, 17:48:49
Ich glaube du hast Visual Studio nicht ganz richtig installiert. Normal wird die Debug DLL (MSVCR90D.dll) mit installiert. Du findest sie dann unter '<Laufwerk:>\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456'.

Gauß
2008-07-10, 18:56:21
Dir ist klar dass die Laufzeitumgebung bei nativen Code von Bibliothek und Anwendung gleich sein muß?

Expandable
2008-07-11, 06:24:39
Ectoplasma: Wie kann man VS falsch installieren? Und das Verzeichnis habe ich nicht, ich habe in WinSxS nur "x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30411.0_none_b563ffc1392087f0" und "x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_96748342450f6aa2", wobei in beiden die msvcr90d.dll drinnen ist. Und wenn ich die dll nicht hätte, warum lässt sich dann z.B. das Bullet Physics SDK problemlos compilen und ausführen?

Gauß: Ja. Ich compile beides entweder im Debug oder im Release-Mode, beide unmanaged und beide mit static oder dll CRT.

Expandable
2008-07-11, 06:48:11
Danke, aber das Problem hat sich scheinbar erledigt. Der Grund, warum die Anwendung sich bei Verwendung einer static lib einfach beendet hat, war der, dass die CRT nicht initialisiert war (Fehler R6030). Der Grund dafür war, dass ich bei einer Windowsanwendung main als Entrypoint verwendet habe, und nicht WinMain. Jetzt geht's.