Referência “indefinida para” erros ao vincular a biblioteca C estática ao código C ++

Eu tenho um arquivo de teste (apenas para o teste de link) onde eu sobrecarregar os operadores new / delete com minha própria biblioteca malloc / free chamada libxmalloc.a. Mas eu continuo recebendo “underdefined reference to” erro como seguindo ao ligar a biblioteca estática, até eu mudar a ordem de test.oe -lxmalloc. Mas tudo funciona bem com outros programas em C que ligam esta biblioteca. Estou tão confuso com essa questão e aprecio qualquer pista.

Erro 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 

Meu arquivo test.cpp:

 #include  #include  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; } 

Meu 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 

    Mas tudo funciona bem com outros programas em C que ligam esta biblioteca.

    Você percebeu que a compilation C e C ++ cria nomes de símbolos diferentes no nível do arquivo de object? Chama-se ‘ mangling de nome ‘.
    O vinculador (C ++) mostraria referências indefinidas como símbolos demangidos na mensagem de erro, o que pode confundir você. Se você inspecionar seu arquivo test.o com nm -u verá que os nomes dos símbolos referenciados não correspondem aos fornecidos em sua biblioteca.

    Se você quiser usar funções ligadas como externals que foram compiladas usando o compilador C simples, você precisará de suas declarações de function dentro de um bloco extern "C" {} que suprime o nome do C ++ para tudo declarado ou definido dentro, por exemplo:

     extern "C" { #include  #include  } 

    Melhor ainda, você pode include suas declarações de function em seus arquivos de header assim:

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