autotools - 修复对 `pow' 和 `floor' 的未定义引用

autotools - Fix undefined reference to `pow' and `floor'

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 出现在构建命令中的所有文件之前。它应该在最后。如果我将 -lm 移动到最后并重新 运行 命令,它会起作用。

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

中解决

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

AC_SEARCH_LIBS([pow], [m])

这样,如果 pow 是在 C 库中定义的(很少见,但有一些操作系统会发生这种情况),则不会向 LIBS 添加任何内容,而如果它是在 [=19 中定义的=], LIBS 将被设置为 -lm;由于 LIBS 在文件列表之后传递,因此链接将起作用。

进一步参考(我以前写的):Finding Libraries on Autotools Mythbuster, --as-needed and linking order.