Ich bin in einer dieser Herausforderungen beteiligt, wo Sie versuchen, die kleinstmögliche Binärdatei zu erstellen, also ich bin mein Programm ohne die C oder C++ ausführen -Zeitbibliotheken (RTL). Ich verlinke nicht auf die DLL-Version oder die statische Version. Ich habe nicht einmal #include
die Header-Dateien. Ich habe das gut funktioniert.Wie VC++ intrinsische Funktionen ohne Laufzeitbibliothek verwenden
Einige RTL-Funktionen, wie memset()
, können nützlich sein, also habe ich versucht, meine eigene Implementierung hinzuzufügen. Es funktioniert gut in Debug-Builds (sogar für die Stellen, an denen der Compiler implizite Aufruf an memset()
generiert). Aber in Release Builds bekomme ich eine Fehlermeldung, dass ich keine intrinsische Funktion definieren kann. Sie sehen, dass in Release-Builds intrinsische Funktionen aktiviert sind und memset()
ein intrinsischer Wert ist.
Ich würde gerne die intrinsische für memset()
in meinem Release-Build verwenden, da es wahrscheinlich inlined und kleiner und schneller als meine Implementierung ist. Aber ich scheine ein In-Catch-22 zu sein. Wenn ich memset()
nicht definiere, beschwert sich der Linker, dass es nicht definiert ist. Wenn ich es definiere, beschwert sich der Compiler, dass ich keine intrinsische Funktion definieren kann.
Kennt jemand die richtige Kombination aus Definition, Deklaration, #pragma
und Compiler- und Linker-Flags, um eine intrinsische Funktion zu erhalten, ohne RTL-Overhead einzuziehen?
Visual Studio 2008, x86, Windows XP +.
Um das Problem ein wenig konkreter zu machen:
extern "C" void * __cdecl memset(void *, int, size_t);
#ifdef IMPLEMENT_MEMSET
void * __cdecl memset(void *pTarget, int value, size_t cbTarget) {
char *p = reinterpret_cast<char *>(pTarget);
while (cbTarget > 0) {
*p++ = static_cast<char>(value);
--cbTarget;
}
return pTarget;
}
#endif
struct MyStruct {
int foo[10];
int bar;
};
int main() {
MyStruct blah;
memset(&blah, 0, sizeof(blah));
return blah.bar;
}
Und ich so bauen:
cl /c /W4 /WX /GL /Ob2 /Oi /Oy /Gs- /GF /Gy intrinsic.cpp
link /SUBSYSTEM:CONSOLE /LTCG /DEBUG /NODEFAULTLIB /ENTRY:main intrinsic.obj
Wenn ich mit meiner Implementierung memset()
kompilieren, ich einen Compiler-Fehler:
error C2169: 'memset' : intrinsic function, cannot be defined
Wenn ich dies ohne meine Implementierung vonkompilieren, erhalte ich einen Linker-Fehler:
error LNK2001: unresolved external symbol _memset
Es ist '/ GL', das ist das Problem, siehe meine Antwort unten. – egrunin