"référence indéfinie à" Erreurs lors de la liaison de la bibliothèque C statique avec du code C++

J'ai un fichier de test (juste pour le test de liaison) où je surcharge la new/delete les opérateurs avec mon propre malloc/free bibliothèque appelée libxmalloc.a. Mais je continue à avoir une erreur" undefined reference to " comme suit lors de la liaison de la bibliothèque statique, même si je change l'ordre de test.o et -lxmalloc. Mais tout fonctionne bien avec d'autres programmes C reliant cette bibliothèque. Je suis tellement confus avec ce problème et j'apprécie tout indice.

Erreur 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

Mon fichier 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;
}

Mon 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
28
demandé sur phoenix 2013-09-18 20:23:48

1 réponses

Mais tout fonctionne bien avec d'autres programmes C reliant cette bibliothèque.

Avez-vous remarqué que la compilation C et c++ crée différents noms de symboles au niveau du fichier objet? Il s'appelle 'name mangling '.
L'éditeur de liens (c++) afficherait des références indéfinies en tant que Symboles démangés dans le message d'erreur, ce qui pourrait vous dérouter. Si vous inspectez votre fichier test.o avec nm -u, vous verrez que les noms de symboles référencés ne correspondent pas à ceux fournis dans votre bibliothèque.

Si vous voulez utiliser des fonctions liées en tant qu'externes qui ont été compilées en utilisant le compilateur C simple, vous aurez besoin de leurs déclarations de fonction enfermées dans un bloc extern "C" {} qui supprime la modification des noms C++ pour tout ce qui est déclaré ou défini à l'intérieur, par exemple:

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

Mieux encore, vous pouvez envelopper vos déclarations de fonction dans vos fichiers d'en-tête comme ceci:

#if defined (__cplusplus)
extern "C" {
#endif

/*
 * Put plain C function declarations here ...
 */ 

#if defined (__cplusplus)
}
#endif
53
répondu πάντα ῥεῖ 2013-09-18 18:04:06