对pow
或floor
的未定义引用通常是由-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.am
或configure.ac
中修复。
答案 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。