Référence non définie à ‘pow’ même si -lm est un drapeau de compilation.

Toute raison cc -g -lm -DBLITZ_HOST_IS_LITTLE_ENDIAN produirait une erreur avec du code utilisant math.h? Est-il possible qu’il y ait une différence entre cc 4.0.3 (version de travail documentée) et 4.6.3 (ma version actuelle)?

makefile et asm.c https://gist.github.com/3801291

C’est sur Ubuntu 12.04

La sortie de mon terminal est un commentaire dans l’essentiel.

Au lieu de

cc -g -lm -DBLITZ_HOST_IS_LITTLE_ENDIAN foo.c 

Essayer:

 cc -g -DBLITZ_HOST_IS_LITTLE_ENDIAN foo.c -lm 

Lorsque l’éditeur de liens recherche une bibliothèque, il crée des liens dans des modules contenant des définitions pour des symboles non encore définis.

Si l’éditeur de liens recherche -lm avant foo.o , alors pow() n’est pas encore indéfini. Inversement, si foo.o vient en premier, cela foo.ofoo.o pow() , ce que -lm peut alors résoudre.


EDIT : Pour accomplir ce conseil dans votre makefile, effectuez les modifications suivantes:

 CFLAGS=-g -DBLITZ_HOST_IS_LITTLE_ENDIAN LDLIBS=-lm ... asm: asm.c $(CC) $(CFLAGS) asm.c $(LDLIBS) -o asm 

J’ai récemment souffert de ce problème en utilisant un constructeur automatique, à savoir drone.io .

Le problème était que gcc dans Ubuntu 12.04 liait par défaut avec -Wl, – au besoin . Dans mon cas, le projet utilisait autotools, ce qui signifie que j’étais trop paresseux pour écrire quoi que ce soit qui modifie l’ordre de compilation. Au lieu de cela, la modification de l’ indicateur si nécessaire a résolu le problème.

 -gabriel_LDFLAGS = $(GLIB2_LIBS) $(DBUS_LIBS) -lssh +gabriel_LDFLAGS = -Wl,--no-as-needed $(GLIB2_LIBS) $(DBUS_LIBS) -lssh 

Pour plus d’informations, vous pouvez consulter la validation de la correction dans https://bitbucket.org/kikeenrique/gabriel/commits/f08eefdca3f7bb90f48f5a6fbfc8839422572508

Vous pouvez consulter le journal avec des erreurs AVANT d’ appliquer le correctif et vous pouvez également consulter le journal sans erreurs APRÈS l’ application du correctif .