Как мне использовать autoconf, чтобы сообщить Rcpp, где найти внешнюю библиотеку?
Я конвертирую программу C++ в пакет R с помощью Rcpp. Моей программе нужна библиотека C++ HTSlib. Я уже понял, как включить эту библиотеку, используя файл с жестко закодированным каталогом библиотеки. Однако я хочу сделать свой пакет переносимым, поэтому я использую для создания файла, чтобы сообщить моему пакету, где его найти. Я создал
Makevars.in
файл в моем
/src
каталог со следующим содержимым:
CXX_STD = CXX11
PKG_CXXFLAGS = @HTS_INCLUDE@
PKG_LIBS = @HTS_LIB@
Я побежал
autoscan
в командной строке для создания следующего файла (а также пустого
autoscan.log
файл):
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([kstring.h])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
AC_CHECK_HEADERS([inttypes.h limits.h stddef.h stdint.h stdlib.h string.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_CHECK_HEADER_STDBOOL
AC_C_INLINE
AC_TYPE_INT16_T
AC_TYPE_INT32_T
AC_TYPE_INT64_T
AC_TYPE_INT8_T
AC_TYPE_SIZE_T
AC_TYPE_SSIZE_T
AC_TYPE_UINT16_T
AC_TYPE_UINT32_T
AC_TYPE_UINT64_T
AC_TYPE_UINT8_T
# Checks for library functions.
AC_FUNC_REALLOC
AC_CHECK_FUNCS([strdup])
AC_OUTPUT
Я переименовал в, затем запустил в командной строке, чтобы получить
configure
файл. Когда я проверяю / перестраиваю свой пакет Rcpp ("Polly"), я получаю следующую ошибку:
Error: package or namespace load failed for ‘Polly’ in dyn.load(file, DLLpath = DLLpath, ...): unable to load shared object '/home/annabelperry/R/Polly.Rcheck/00LOCK-Polly/00new/Polly/libs/Polly.so': /home/annabelperry/R/Polly.Rcheck/00LOCK-Polly/00new/Polly/libs/Polly.so: undefined symbol: hts_close Error: loading failed Execution halted ERROR: loading failed * removing ‘/home/annabelperry/R/Polly.Rcheck/Polly’
Вышеупомянутая ошибка совпадает с той, которую я получаю, если пытаюсь проверить пакет при отсутствии
Makevars
файл с жестко запрограммированными каталогами библиотек, поэтому я думаю, что Rcpp не может найти
hts
библиотека с моим текущим
configure.ac
файл.
Кроме того, когда я запускаю в командной строке после запуска, я получаю следующую ошибку:
config.status: error: cannot find input file: `config.h.in'
Я пытался...
- Добавление следующего кода в перед запуском:
AC_SEARCH_LIBS([hts_close], [hts], [], [
AC_MSG_ERROR([unable to find the hts_close() function])
])
- Добавление следующего кода в
# Checks for libraries.
перед запуском:
AC_CHECK_LIB([hts], [], [], [])
- Добавление заголовков
hts.h
,hts_defs.h
,hts_endian.h
,hts_log.h
,kroundup.h
,kstring.h
, а такжеsam.h
кAC_CHECK_HEADERS([])
вconfigure.scan
перед запускомautoconf
.
Может ли кто-нибудь сказать мне, что я делаю не так?
ОБНОВЛЕНИЕ: я отредактировал свой сценарий configure.ac в соответствии с ответом Ральфа Стубнера здесь: Написание файла `configure` для пакета r
Вот мой новый скрипт configure.ac
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_INIT([Polly], 0.1.0)
AC_LANG(C++)
AC_REQUIRE_CPP
AC_PROG_CXX
# default values
AC_SUBST([HTS_INCLUDE], "-I/home/annabelperry/R/include/")
AC_SUBST([HTS_LIB], "/home/annabelperry/R/lib/libhts.a")
# allow for override
AC_ARG_WITH([hts],
AC_HELP_STRING([--with-hts=PREFIX],
[path where hts is installed]),
[
HTS_INCLUDE="-I${with_hts}/include"
HTS_LIBS="${with_hts}/lib/htslib.a"
],
[])
# create and report output
AC_CONFIG_FILES([Makevars])
AC_OUTPUT
echo
echo "Final Makevars"
cat Makevars
AC_OUTPUT
Вот мой новый скрипт Makevars.in:
CXX_STD = CXX11
PKG_CXXFLAGS = @HTS_INCLUDE@
PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) @HTS_LIB@, -fPIC
Моя программа теперь успешно проходит
./configure
, но возвращает эту ошибку при проверке:
E> g++: error: /home/annabelperry/R/lib/libhts.a,: No such file or directory