autotools - 修复对 `pow' 和 `floor' 的未定义引用
autotools - Fix undefined reference to `pow' and `floor'
对 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
出现在构建命令中的所有文件之前。它应该在最后。如果我将 -lm
移动到最后并重新 运行 命令,它会起作用。
但这并不能解决根本问题。什么地方出了错?我应该在哪里寻找问题或潜在的修复方法?我想这个问题可以在 Makefile.am
或 configure.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.
对 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
出现在构建命令中的所有文件之前。它应该在最后。如果我将 -lm
移动到最后并重新 运行 命令,它会起作用。
但这并不能解决根本问题。什么地方出了错?我应该在哪里寻找问题或潜在的修复方法?我想这个问题可以在 Makefile.am
或 configure.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.