2016-06-09 6 views
0

Неопределенная ссылка на pow или floor часто вызвана отсутствующей или неуместной опцией -lm (см. this question).autotools - Исправить неопределенные ссылки на `pow 'и` floor'

Я видел эту ошибку в open source repository после запуска через рабочий процесс Autotools: aclocalautoconfautomake --add-missing./configuremake.

Вот команда, нарушившая сборки с выхода макияжа:

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.

ответ

3

Пробег -lm как LDFLAGS запись; это не так, это вместо записи LIBS. Самый простой способ исправить это, чтобы избежать ссылок -lm в Makefile.am на всех, и вместо того, чтобы добавить к вашим configure.ac:

AC_SEARCH_LIBS([pow], [m]) 

Таким образом, если pow определяются в библиотеке C (редко, но есть несколько операционок, где это случается) ничего не будет добавлено к LIBS, тогда как если оно определено в libm, LIBS будет установлено в -lm; поскольку LIBS передается после списка файлов, связь будет работать.

Дальнейшая ссылка (написанная мной в прошлом): Finding Libraries on Autotools Mythbuster, --as-needed and linking order.

+0

Это работает, спасибо! Предположительно, нужно делать то же самое для пола? Похоже, что это 'AC_SEARCH_LIBS' с' S'. – jtpereyda

+0

Спасибо, я продолжаю делать эту ошибку ^^; И правильно, вы можете сделать это для 'floor' так же хорошо, хотя я не знаю ни одной библиотеки C, в которой' pow' и 'floor' находятся в разных библиотеках. –