autotools - 修复未定义的引用`pow'和'地板'

时间:2016-06-09 23:11:19

标签: autotools autoconf automake

powfloor的未定义引用通常是由-lm选项丢失或放错位置引起的(请参阅this question)。

在运行autotools工作流程后,我在open source repository中看到了此错误:aclocal autoconf automake --add-missing ./configure make

以下是来自make输出的违规构建命令:

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

如您所见,-lm位于build命令中的所有文件之前。它应该在最后。如果我将-lm移到最后并重新运行命令,它就会起作用。

但这并不能解决根本问题。什么地方出了错?我应该在哪里找到问题或潜在的解决方案?我想这个问题可以在Makefile.amconfigure.ac中修复。

1 个答案:

答案 0 :(得分:3)

您将-lm作为LDFLAGS条目传递;它不是,而是LIBS条目。解决这个问题的简单方法是避免在-lm中引用Makefile.am,而是添加到configure.ac

AC_SEARCH_LIBS([pow], [m])

这种方式如果在C库中定义了pow(很少但有少数操作系统会发生这种情况),则LIBS中不会添加任何内容,而如果libm中定义了LIBS-lm将设为LIBS;由于var third_index; var i=0; /*in this example the indexes of the object are not int*/ var obj = { one: 1, two: 2, three: 3, four: 4, five: 5 }; $.each(obj, function(index,value) { i++; if(i==3) third_index=value; }); console.log(third_index);在文件列表之后传递,因此链接将起作用。

进一步参考(过去我写的):Finding Libraries on Autotools Mythbuster--as-needed and linking order