2013-08-13 2 views
3

Я начинаю начинать с autotools, и я не могу понять, как правильно использовать внешнюю библиотеку с помощью autotools.Связывание общей библиотеки Autotools

Вот моя иерархия каталогов.

. 
├── configure.ac 
├── Makefile.am 
├── README 
└── src 
    (source files) 
    └── Makefile.am 

Имя библиотеки является acml_mp и, по умолчанию, установленный в /opt/acml5.3.1/gfortran64/lib. Существует также каталог под названием /opt/acml5.3.1/gfortran64/include для включения. Когда я компилирую без Autotools, в том числе обычных флагов компилятора работает отлично:

g++ ... -L/opt/acml5.3.1/gfortran64_mp/lib -I/opt/acml5.3.1/gfortran64_mp/include -lacml_mp ... 

В configure.ac, я поставил команду AC_LIB_LINKFLAGS([acml_mp]) который я думаю, имеет дело только с -lacml_mp флагом.

В принципе, конечной целью является поиск в autoconf для этой библиотеки и создание make-файла, сгенерированного automake, при правильной компоновке включают правильные пути link/include. Наконец, при компиляции вручную, я всегда нужно изменить переменную окружения LD_LIBRARY_PATH с помощью команды

Export LD_LIBRARY_PATH=/opt/acml5.3.1/gfortran64_mp/lib:$LD_LIBRARY_PATH 

, который, в идеале, я хотел бы избежать необходимости пользователь может делать. Извиняюсь, если эта информация уже существует, я просмотрел SO и Google в течение нескольких часов безрезультатно.

ответ

5

Проблема с поиском, что /opt/acml5.3.1/gfortran никогда не будет стандартным (поиск) место для библиотек (и заголовки), как /usr/lib, /usr/local/lib и т.д. Вероятно, лучше всего поставить это место явно с помощью --with-acml для настройки.

AC_ARG_WITH описание макроса here. Предполагая, что test "x$with_acml" != xno, вы можете попробовать связать программу с AC_LINK_IFELSE.

AC_LANG_PUSH([C]) # or [Fortran] 

ac_save_acml_CPPFLAGS="$CPPFLAGS" # or FCFLAGS instead of CPPFLAGS. 
ac_save_acml_LIBS="$LIBS" 

ac_acml_CPPFLAGS="-I${with_acml}/include" 
ac_acml_LIBS="-L${with_acml}/libs -lacml_mp" 

CPPFLAGS+="$ac_acml_CPPFLAGS" 
LIBS+="$ac_acml_LIBS" 

AC_LINK_IFELSE([AC_LANG_PROGRAM(... some C or Fortran program ...)],, 
       AC_MSG_FAILURE([couldn't link with acml])) 

AC_LANG_POP 

# we *could* stop here... but we might need the original values later. 

CPPFLAGS="$ac_save_acml_CPPFLAGS" 
LIBS="$ac_save_acml_LIBS" 

AC_SUBST(ACML_CPPFLAGS, $ac_acml_CPPFLAGS) 
AC_SUBST(ACML_LIBFLAGS, $ac_acml_LIBS) 

Предполагая, что вы инициализирован поддержку LIBTOOL с LT_INIT, вы можете добавить библиотеку ACML с $(ACML_LIBFLAGS) ваших собственных библиотек в src/Makefile.am через переменную LIBADD, или исполняемых файлов с переменной LDADD. или <lib>_la_LIBADD, <prog>_LDADD соответственно.

Чтобы скомпилировать источники с помощью пути $(ACML_CPPFLAGS), добавьте его в переменную AM_CPPFLAGS. Или переменная <prog>_CPPFLAGS.

Трудно быть конкретным, не зная, как ваш Makefile.am уже настроен. Я знаю, что это выглядит сложным, но лучше сначала получить инфраструктуру. Я добавлю ответ, если у вас появятся дополнительные вопросы.