Estoy involucrado en uno de esos desafíos donde intenta producir el binario más pequeño posible, entonces estoy construyendo mi programa sin la ejecución de C o C++ a tiempo real (RTL). No enlace a la versión DLL o la versión estática. Ni siquiera #include
los archivos de encabezado. Tengo esto funcionando bien.Cómo usar las funciones intrínsecas de VC++ sin biblioteca de tiempo de ejecución
Algunas funciones de RTL, como memset()
, pueden ser útiles, así que intenté agregar mi propia implementación. Funciona bien en las versiones de depuración (incluso para aquellos lugares donde el compilador genera una llamada implícita al memset()
). Pero en las compilaciones de Release, aparece un error que dice que no puedo definir una función intrínseca. Verá, en las compilaciones de Release, las funciones intrínsecas están habilitadas, y memset()
es intrínseco.
Me encantaría utilizar el intrínseco para memset()
en mis compilaciones de lanzamiento, ya que es probablemente en línea y más pequeño y más rápido que mi implementación. Pero parece que estoy en catch-22. Si no defino memset()
, el enlazador se queja de que no está definido. Si lo defino, el compilador se queja de que no puedo definir una función intrínseca.
¿Alguien sabe la combinación correcta de definición, declaración, #pragma
, y banderas del compilador y enlazador para obtener una función intrínseca sin tener que recurrir a la sobrecarga de RTL?
Visual Studio 2008, x86, Windows XP +.
Para hacer que el problema un poco más concreto:
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;
}
Y construyo como esto:
cl /c /W4 /WX /GL /Ob2 /Oi /Oy /Gs- /GF /Gy intrinsic.cpp
link /SUBSYSTEM:CONSOLE /LTCG /DEBUG /NODEFAULTLIB /ENTRY:main intrinsic.obj
Si compilo con mi aplicación de memset()
, me sale un error de compilación:
error C2169: 'memset' : intrinsic function, cannot be defined
Si compilo esto sin mi implementación de memset()
, me sale un error de vinculador:
error LNK2001: unresolved external symbol _memset
Es '/ GL' ese es el problema, mira mi respuesta a continuación. – egrunin