2016-06-09 4 views
0

Une référence indéfinie à pow ou floor est souvent causée par une option -lm manquante ou mal placée (voir this question).autotools - Correction d'une référence indéfinie à `pow 'et` floor'

J'ai vu cette erreur dans un open source repository après l'exécution par le flux de travail autotools: aclocalautoconfautomake --add-missing./configuremake.

Voici la commande build incriminée de la sortie de marque:

gcc -pthread -g -O2 -lm -o 01_w_Defects bit_shift.o main.o buffer_overrun_dynamic.o memory_allocation_failure.o buffer_underrun_dynamic.o memory_leak.o cmp_funcadr.o not_return.o conflicting_cond.o null_pointer.o data_lost.o overrun_st.o data_overflow.o ow_memcpy.o data_underflow.o pow_related_errors.o dead_code.o ptr_subtraction.o dead_lock.o race_condition.o deletion_of_data_structure_sentinel.o redundant_cond.o double_free.o return_local.o double_lock.o sign_conv.o double_release.o sleep_lock.o endless_loop.o st_cross_thread_access.o free_nondynamic_allocated_memory.o st_overflow.o free_null_pointer.o stubs.o func_pointer.o st_underrun.o function_return_value_unchecked.o underrun_st.o improper_termination_of_block.o uninit_memory_access.o insign_code.o uninit_pointer.o invalid_extern_1.o uninit_var.o invalid_extern.o unlock_without_lock.o invalid_memory_access.o unused_var.o littlemem_st.o wrong_arguments_func_pointer.o livelock.o zero_division.o lock_never_unlock.o 

Comme vous pouvez le voir, -lm vient avant tous les fichiers dans la commande build. Cela devrait venir à la fin. Si je déplace -lm à la fin et réexécutez la commande, cela fonctionne.

Mais cela ne résout pas le problème de la racine. Qu'est ce qui ne s'est pas bien passé? Où dois-je chercher pour trouver le problème ou une solution potentielle? J'imagine que ce problème pourrait être corrigé dans Makefile.am ou configure.ac.

Répondre

3

Vous transmettez -lm en tant qu'entrée LDFLAGS; ce n'est pas, c'est plutôt une entrée LIBS. Le moyen facile de résoudre ce problème est d'éviter le référencement -lm dans Makefile.am du tout et au lieu d'ajouter à votre configure.ac:

AC_SEARCH_LIBS([pow], [m]) 

De cette façon, si pow est défini dans la bibliothèque C (rare, mais il y a quelques systèmes d'exploitation où cela se produit) rien ne sera ajouté à LIBS alors que s'il est défini dans libm, LIBS sera défini sur -lm; puisque LIBS est passé après la liste des fichiers, la liaison fonctionnera.

Autre référence (écrite par moi dans le passé): Finding Libraries on Autotools Mythbuster, --as-needed and linking order.

+0

Ça marche, merci! Vraisemblablement, on devrait faire la même chose pour le sol? On dirait que c'est 'AC_SEARCH_LIBS' avec un' S'. – jtpereyda

+0

Merci, je continue à faire cette erreur ^^; Et bien, vous pouvez le faire aussi bien pour 'floor', bien que je ne connaisse aucune bibliothèque C dans laquelle' pow' et 'floor' se trouvent sur des bibliothèques différentes. –