2016-12-09 14 views
0

Я пытаюсь протестировать библиотеку 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/

+1

Как указал Диего, LDFLAGS будет помещен перед объектом или исходным кодом, а LIBS будет помещен после. Моя основная ошибка заключается в использовании этих двух переменных. –

ответ

2

Это выглядит как вы передаете библиотеку в неправильной переменной; если вы проходили библиотеку в LIBS, это было бы в правильном положении, потому что autoconf делает правильные вещи.

Теперь вставленный код содержит синтаксическую ошибку слишком (с помощью == который является сравнение вместо =, который является назначение), и логический один, так как TEST_LIBS была переменная, используемая в конкретной должности вы эталонным. Так что это не то, что устанавливает -lbamtools в любом из заказов.

save_LIBS=$LIBS 
LIBS="$LIBS -lbamtools" 
AC_LINK_IFELSE(
     [AC_LANG_PROGRAM([#include <api/BamReader.h>], [BamTools::BamReader dummy])], 
     [save_LIBS="$LIBS"; HAVE_BAMTOOLS=1], 
     [AC_MSG_WARN([libbamtools is not installed])]) 
LIBS=$save_LIBS 

Это должно делать то, что вы ищете, хотя оно все еще немного сложнее, чем могло бы быть. Вы можете использовать AC_CHECK_TYPE, чтобы проверить, определено ли значение BamTools::BamReader.

+0

Диего, спасибо. Трудно учиться autotools; нет хороших книг, и документация очень ограничена. Более того, не так много людей освоили autotools. Я должен учиться в кусках. –

+0

Есть автоузел John Calcote и мой автомат Mytbuster, но последний только указал на известные проблемы, а не на полное объяснение. –

+0

Я прочитал книгу Джона Калькота. Это очень хорошо и дало мне понимание всей системы. Второе издание этой книги должно содержать некоторые примеры на C++. –

 Смежные вопросы

  • Нет связанных вопросов^_^