2009-10-17 2 views
5

Dies ist Teil einer Reihe von mindestens zwei eng verwandte, aber unterschiedliche Fragen. Ich hoffe, ich mache das Richtige, indem ich sie getrennt befrage.Erstellen von Visual C++ - App, die CRT-Funktionen nicht verwendet noch Referenzen einige

Ich versuche, meine Visual C++ 2008 App ohne die C-Laufzeitbibliothek zu arbeiten. Es ist eine Win32-GUI-App ohne MFC oder andere ausgefallene Sachen, einfach nur Windows-API.

Also setze ich Projekteigenschaften -> Konfiguration -> C/C++ -> Erweitert -> Standard-Bibliotheksnamen auslassen auf Ja (Compiler-Flag /Zl) und neu erstellt. Lassen Sie uns so tun, als hätte ich eine geeignete Einstiegspunktfunktion geschrieben, die Gegenstand der my other question.

ist Ich bekomme zwei Linker Fehler; sie sind wahrscheinlich verwandt. Der Linker klagt über ungelöste externe Symbole __fltused und _memcpy in foobar.obj. Unnötig zu sagen, verwende ich weder explizit in meinem Programm, aber ich verwende memcpy irgendwo in foobar.cpp. (Ich würde CopyMemory verwendet haben, aber das stellt sich heraus #define d zu sein, daß sie identisch zu memcpy ...)

(Ich dachte, ich loswerden der memcpy Problem bekommen könnte durch die Verwendung eines Compilers intrinsische, wie #pragma intrinsic(memcpy), aber das macht kein Unterschied.)

Wenn ich am Präprozessorausgabe aussehen (/P an die Compiler-Befehlszeile hinzufügen), sehe ich keine Hinweise auf entweder __fltused oder _memcpy in foobar.i.

Also, meine Frage ist: Woher kommen diese Linker Fehler und wie löse ich sie?

+0

Und deine Frage ist? –

+0

Ah ... muss das irgendwie verloren haben, während ich dieses Ding in zwei geteilt habe. Erneut hinzugefügt, danke! – Thomas

Antwort

8

__fltused bedeutet, dass Sie einige Floats oder Doubles verwendet oder zumindest deklariert haben. Der Compiler injiziert dieses 'nutzlose' Symbol, um zu bewirken, dass eine floating-Unterstützung .obj aus dem crt geladen wird. Sie können einfach dieses Problem umgehen, indem ein Symbol mit dem

#ifdef __cplusplus 
extern "C" { 
#endif 
int __fltused=0; 
#ifdef __cplusplus 
} 
#endif 

WRT _memcpy Name erklärt wird - Memcpy ist eine __cdecl Funktion und alle cdecl Funktionen erhalten eine automatische _ als Teil ihrer Dekoration. Also, wenn Sie sagen "__cdecl memcpy" - der Compiler & Linker gehen auf der Suche nach einem Symbol namens "_memcpy". Intrinsische Funktionen - auch explizit angefordert - können weiterhin importiert werden, wenn die Build-Einstellungen Debug-Einstellungen haben, die Intrinsics widersprechen. Sie müssen also irgendwann Ihre eigenen memcpy und verwandte Funktionen implementieren.

+0

Danke für die schnelle Antwort! Leider scheint der '__fltused' Trick nichts für mich zu tun. Ich setze 'int __fltused = 0;' oben auf 'foobar.cpp'; statisch oder nicht-statisch macht auch keinen Unterschied. – Thomas

+0

Ich bin mir auch ziemlich sicher, dass ich nirgendwo Floats oder Doubles verwende. Mein Quellbaum enthält diese Wörter nicht. – Thomas

+0

Ah, es in 'extern" C "' wickelte den Trick. Vielen Dank! – Thomas

0

Ich empfehle, die "generate assembly listing" (oder einige solcher) Compiler-Option für foobar.cpp einmal und dann überprüfen Sie den Assembler-Code. Dies sollte Ihnen wirklich sagen, wo diese Symbole verwendet werden.

+0

Ich bin nicht gerade ein x86 Assembler Guru. Aber wenn ich die Werkzeuge herausfinden kann, könnte ich es morgen versuchen. – Thomas

Verwandte Themen