Как мне использовать 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'

Я пытался...

  1. Добавление следующего кода в перед запуском:
      AC_SEARCH_LIBS([hts_close], [hts], [], [
  AC_MSG_ERROR([unable to find the hts_close() function])
])
  1. Добавление следующего кода в # Checks for libraries. перед запуском:
      AC_CHECK_LIB([hts], [], [], [])
  1. Добавление заголовков 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

0 ответов

Другие вопросы по тегам