2016-06-09 621 views
0

Ein undefinierter Verweis auf pow oder floor wird oft durch eine fehlende oder falsche -lm Option verursacht (siehe this question).autotools - Fix undefinierter Verweis auf `pow 'und` floor'

habe ich diesen Fehler in einem open source repository nach dem Autotools Workflow läuft durch: aclocalautoconfautomake --add-missing./configuremake. Hier

ist der säumige Build Befehl aus dem Make-Ausgang:

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 

Wie Sie sehen können, -lm kommt vor, alle Dateien in dem Build-Befehl. Es sollte am Ende kommen. Wenn ich -lm an das Ende verschiebe und den Befehl erneut ausführe, funktioniert es.

Aber das behebt das Grundproblem nicht. Was schief gelaufen ist? Wo sollte ich nach dem Problem oder einer möglichen Lösung suchen? Ich kann mir vorstellen, dass dieses Problem entweder in Makefile.am oder configure.ac behoben werden kann.

Antwort

3

Sie übergeben -lm als LDFLAGS Eintrag; es ist nicht, es ist stattdessen ein LIBS Eintrag. Der einfache Weg, um dies zu beheben ist zu vermeiden -lm in Makefile.am bei allen Verweisen auf und stattdessen zu Ihrem configure.ac hinzufügen:

AC_SEARCH_LIBS([pow], [m]) 

diese Weise, wenn pow wird in der C-Bibliothek (selten definiert, aber es gibt ein paar OSes wo das passiert) LIBS wird nichts hinzugefügt, wenn libm definiert ist, wird LIBS auf -lm gesetzt; Da LIBS nach der Liste der Dateien übergeben wird, funktioniert die Verknüpfung.

Weitere Referenz (geschrieben von mir in der Vergangenheit): Finding Libraries on Autotools Mythbuster, --as-needed and linking order.

+0

Das funktioniert, danke! Vermutlich sollte man das gleiche für den Boden tun? Sieht so aus, als wäre es 'AC_SEARCH_LIBS' mit einem' S'. – jtpereyda

+0

Danke, ich mache diesen Fehler ^^; Und richtig, du kannst das genauso gut für "floor" machen, obwohl ich keine C-Bibliothek kenne, in der sich 'pow' und' floor' in verschiedenen Bibliotheken befinden. –