Aufbau Visual C++ - app, die nicht von CRT-Funktionen noch einige Referenzen
Dies ist Teil einer Reihe von mindestens zwei eng miteinander verbundene, aber unterschiedliche Fragen. Ich hoffe, dass ich das richtige Tue, indem er Sie getrennt.
Ich versuche, mein Visual C++ 2008-app arbeiten, ohne die C-Laufzeit-Bibliothek. Es ist ein Win32-GUI-app ohne MFC oder andere fancy stuff, einfach nur Windows API.
So habe ich mich auf Projekt Eigenschaften -> Konfiguration -> C/C++ -> Erweitert -> Weglassen Standard-Bibliothek-Namen auf " ja " (compiler-flag /Zl
) und wieder aufgebaut. Tue so, als ich geschrieben habe, einen geeigneten Einstiegspunkt-Funktion, die das Thema meine andere Frage.
Bekomme ich zwei linker-Fehler; Sie sind wahrscheinlich im Zusammenhang. Der linker beschwert sich über nicht aufgelöste externe Symbole __fltused
und _memcpy
im foobar.obj
. Unnötig zu sagen, ich benutze weder explizit in meinem Programm, aber ich nutze memcpy
irgendwo in foobar.cpp
. (Ich würde verwendet haben CopyMemory
aber herausstellt #define
d identisch sein memcpy
...)
(Ich dachte, ich könnte loswerden die memcpy
problem durch die Verwendung eines Compilers intrinsische, wie #pragma intrinsic(memcpy)
, aber das macht keinen Unterschied.)
Wenn ich Blick auf der Präprozessor-Ausgabe (hinzufügen /P
zu der compiler-Befehlszeile), sehe ich keine Verweise auf entweder __fltused
oder _memcpy
im foobar.i
.
So, meine Frage ist: , Wo diese linker-Fehler kommen, und wie löse ich Sie?
- Und Ihre Frage ist?
- Ah... muss verloren haben, dass irgendwie während der Spaltung dieses Ding in zwei. Re-Hinzugefügt, danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
__fltused
bedeutet, Sie verwenden oder haben zumindest erklärt einige floats oder doubles. Der compiler fügt diese 'sinnlos' - symbol, um die Ursache für floating support .obj zu bekommen, geladen, aus der crt. Sie können dies umgehen, indem Sie einfach erklären ein symbol mit dem NamenWRT _memcpy - memcpy ist eine __cdecl-Funktion, und alle cdecl-Funktionen erhalten Sie eine automatische _ als Teil Ihrer Dekoration. also, wenn Sie sagen, "__cdecl memcpy" - compiler & linker die Suche nach einem symbol namens '_memcpy'. Intrinsische Funktionen - sogar ausdrücklich gewünscht - noch importiert werden, wenn die build-Einstellungen die debug-Einstellungen, die Kontra-geben-Interna. So sind Sie gehen zu müssen, um implementieren Ihr eigenes memcpy und Verwandte Funktionen irgendwann sowieso.
__fltused
trick scheint zu tun, nichts für mich. Ich legteint __fltused = 0;
obenfoobar.cpp
; statisch oder nicht-statisch ist nicht einen Unterschied machen, entweder.extern "C"
hat den trick. Danke!EXTERN_C
(deklariert in<winnt.h>
) statt:EXTERN_C int _fltused = 0;
. Es gibt keine Notwendigkeit, zu unterscheiden, basierend auf der__cplusplus
Präprozessor-symbol, denn das ist bereits berücksichtigt mit derEXTERN_C
makro.Empfehle ich die Einstellung "Generiere Liste der assembly" (oder so) compiler-option für foobar.cpp einmal, und dann mit der Inspektion der assembler-code. Sollte dies wirklich sagen, wo diese Symbole verwendet werden.