Я пытаюсь протестировать библиотеку C++ и должен сделать немного больше, чем AC_SEARCH_LIBS или AC_CHECK_LIB. Тем не менее, мой компоновщик придирчив к порядку опций (g ++ версия 5.4.0).AC_LANG_PROGRAM завершил этап компоновщика из-за порядка компоновщика ссылок
Мой configure.ac содержит следующий код:
AC_LINK_IFELSE(
[AC_LANG_PROGRAM([#include <api/BamReader.h>], [BamTools::BamReader dummy])],
[TEST_LIBS=="$TEST_LIBS -lbamtools"] [HAVE_BAMTOOLS=1],
[AC_MSG_WARN([libbamtools is not installed])])
Я знаю, что Bamtools будут устанавливать на моей системе. Это сгенерирует отрицательный результат:
checking api/BamReader.h usability... yes
checking api/BamReader.h presence... no
configure: WARNING: api/BamReader.h: accepted by the compiler, rejected by the preprocessor!
configure: WARNING: api/BamReader.h: proceeding with the compiler's result
checking for api/BamReader.h... yes
configure: WARNING: libbamtools is not installed <-- this line
После некоторого расследования это выглядит как вариант варианта компоновщика.
Файл conftest.cpp выглядит следующим образом:
#include <api/BamReader.h>
int main() {
BamTools::BamReader dummy;
return 0;
}
Autoconf макрос вызова
g++ -o conftest -g -O2 -I/usr/local/include/bamtools -L/usr/local/lib/bamtools -lbamtools conftest.cpp/tmp/ccZiV1J9.o: In function `main':
/home/kzhou/coding/tmp/conftest.cpp:24: undefined reference to `BamTools::BamReader::BamReader()'
/home/kzhou/coding/tmp/conftest.cpp:24: undefined reference to `BamTools::BamReader::~BamReader()'
collect2: error: ld returned 1 exit status
Если лет изменить порядок, поставив -lbamtools до конца, то линкер доволен:
g++ -o conftest -g -O2 -I/usr/local/include/bamtools -L/usr/local/lib/bamtools conftest.cpp -lbamtools
Интересно, что необходимо обновить AC_LANG_PROGRAM? Прокомментируйте, пожалуйста. До сих пор я не нашел хорошего решения этой проблемы. Пожалуйста ссылка:
https://nerdland.net/2009/07/detecting-c-libraries-with-autotools/
Как указал Диего, LDFLAGS будет помещен перед объектом или исходным кодом, а LIBS будет помещен после. Моя основная ошибка заключается в использовании этих двух переменных. –