visual una propias librerias libreria library incluir dev create crear compile como c++ c static-libraries

una - "Referencia indefinida a" errores al vincular la biblioteca de C estática con el código de C++



incluir librerias propias en c++ (1)

Tengo un archivo de prueba (solo para la prueba de enlace) donde sobrecargo los operadores nuevos / eliminar con mi propia biblioteca malloc / free llamada libxmalloc.a. Pero sigo obteniendo un error de "referencia no definida" como el siguiente al vincular la biblioteca estática, incluso cambio el orden de test.o y -lxmalloc. Pero todo funciona bien con otros programas de C que enlazan esta biblioteca. Estoy tan confundido con este problema y aprecio cualquier pista.

Error MSg:

g++ -m64 -O3 -I/usr/include/ethos -I/usr/include/nacl/x86_64 -c -o test.o test.cpp g++ -m64 -O3 -L. -o demo test.o -lxmalloc test.o: In function `operator new(unsigned long)'': test.cpp:(.text+0x1): undefined reference to `malloc(unsigned long)'' test.o: In function `operator delete(void*)'': test.cpp:(.text+0x11): undefined reference to `free(void*)'' test.o: In function `operator new[](unsigned long)'': test.cpp:(.text+0x21): undefined reference to `malloc(unsigned long)'' test.o: In function `operator delete[](void*)'': test.cpp:(.text+0x31): undefined reference to `free(void*)'' test.o: In function `main'': test.cpp:(.text.startup+0xc): undefined reference to `malloc(unsigned long)'' test.cpp:(.text.startup+0x19): undefined reference to `malloc(unsigned long)'' test.cpp:(.text.startup+0x24): undefined reference to `free(void*)'' test.cpp:(.text.startup+0x31): undefined reference to `free(void*)'' collect2: ld returned 1 exit status make: *** [demo] Error 1

Mi archivo test.cpp:

#include <dual/xalloc.h> #include <dual/xmalloc.h> void* operator new (size_t sz) { return malloc(sz); } void operator delete (void *ptr) { free(ptr); } void* operator new[] (size_t sz) { return malloc(sz); } void operator delete[] (void *ptr) { free(ptr); } int main(void) { int *iP = new int; int *aP = new int[3]; delete iP; delete[] aP; return 0; }

Mi Makefile:

CFLAGS += -m64 -O3 -I/usr/include/ethos -I/usr/include/nacl/x86_64 CXXFLAGS += -m64 -O3 LIBDIR += -L. LIBS += -lxmalloc all: demo demo: test.o $(CXX) $(CXXFLAGS) $(LIBDIR) -o demo test.o $(LIBS) test.o: test.cpp $(CXX) $(CFLAGS) -c -o $@ $< clean: - rm -f *.o demo


Pero todo funciona bien con otros programas de C que enlazan esta biblioteca.

¿Notaste que la compilación C y C ++ crea diferentes nombres de símbolos en el nivel de archivo de objeto? Se llama '' name mangling ''.
El enlazador (C ++) mostraría referencias no definidas como símbolos exigidos en el mensaje de error, lo que podría confundirlo. Si inspecciona su archivo test.o con nm -u , verá que los nombres de los símbolos a los que se hace referencia no coinciden con los provistos en su biblioteca.

Si desea usar funciones vinculadas como externas que fueron compiladas usando el compilador simple de C, necesitará sus declaraciones de funciones encerradas en un bloque extern "C" {} que suprime la creación de nombres de C ++ para todo lo declarado o definido en el interior, por ejemplo:

extern "C" { #include <dual/xalloc.h> #include <dual/xmalloc.h> }

Mejor aún, puede envolver sus declaraciones de funciones en sus archivos de encabezado de esta manera:

#if defined (__cplusplus) extern "C" { #endif /* * Put plain C function declarations here ... */ #if defined (__cplusplus) } #endif