Как заставить компоновщики работать, когда я включаю заголовок RInside в программу на C++?

Я пытаюсь скомпилировать примеры в стандартном репозитории примеров пакета RInside. Я уже пытался запустить Makefile, который уже был в репозитории, но это не сработало. До сих пор я столкнулся с несколькими ошибками, некоторые из которых уже устранены. Проблема в том, что каждый раз, когда я исправляю ошибку, происходит одно из двух: появляется новая ошибка или снова появляется старая. Это код разных make-файлов с соответствующей ошибкой:

1) Makefile без -L

    all:
        g++ -I/usr/share/R/include -I/home/manuel/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include -I/home/manuel/R/x86_64-pc-linux-gnu-library/3.4/RInside/include rinsidetest.cpp

как и ожидалось, применение make к этому файлу возвращает ошибки о неопределенных ссылках на RInside::'s

undefined reference to `RInside::RInside(int, char const* const*, bool, bool, bool)'

2) Makefile со ссылками -L

all:
g++ -I/usr/share/R/include -I/home/manuel/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include -I/home/manuel/R/x86_64-pc-linux-gnu-library/3.4/RInside/include -L/usr/lib/R/site-library/RInside/lib -L/home/manuel/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/libs -lRInside -lRcpp -L/usr/lib/R/lib -lR -Wl,-rpath,/home/manuel/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/libs -lRInside -Wl,-rpath,/home/manuel/R/x86_64-pc-linux-gnu-library/3.4/RInside/lib rinsidetest.cpp

Ошибка была такая:

/usr/bin/ld: cannot find -lRcpp

оказалось, что файл .so в репозитории libs назывался Rcpp.so, поэтому я переименовал его в libRcpp.so и ошибка исчезла.

3)После переименования Rcpp.so в libRcpp.so я применил make к тому же makefile из пункта 2) и опять ошибки были про неопределенные ссылки на RInside:::

rinsidetest.cpp:(.text+0x100): undefined reference to `RInside::RInside(int, char const* const*, bool, bool, bool)

4) Применение make к make-файлу, который уже был в папке

make -f Makefile

ошибка (после изменения R_LIBS_USER на

R_LIBS_USER :=      "/home/manuel/R/x86_64-pc-linux-gnu-library/3.4"

было:

fatal error: RInside.h: No such file or directory 
compilation terminated.

До сих пор я читал более общие вопросы о включении заголовков в C++ и пару вопросов конкретно о RInside, на некоторые из которых ответил Дирк Эддельбюттель, написавший пакет, но все ответы были связаны с использованием компоновщики -L<path>/include, которые я почти уверен, что использую правильно.

Вот некоторые из вопросов, которые я читал до сих пор:

Компиляция программы RInside с помощью g++ в LinuxКомпиляция программы RInside с помощью g++ в Linux

Компиляция пакета Rcpp

http://lists.r-forge.r-project.org/pipermail/rcpp-devel/2012-May/003829.html

http://rcpp-devel.r-forge.r-project.narkive.com/A70U2nVw/problem-with-rinside-hello-world-example

Я использую Ubuntu 16.04 с R версии 3.4.4. Любая помощь будет оценена!


person msanavarro    schedule 24.04.2018    source источник
comment
stackoverflow.com/questions/51056252/fatal-error-for -rinside-h   -  person madeinQuant    schedule 03.02.2019


Ответы (1)


Я не уверен, где вы заблудились, но основная идея состоит в том, чтобы просто сказать следующее:

  1. Перейдите в каталог.
  2. make clean на всякий случай.
  3. make (то есть make all) или только один.

и это все еще работает --- я сам использую Debian/Ubuntu.

Вот сделайте make rinside_sample0, чтобы доказать это, а затем запустите его:

edd@rob:~$ cd git/rinside/inst/examples/standard/
edd@rob:~/git/rinside/inst/examples/standard$ make -f GNUmakefile clean
rm -vf rinside_sample9 [....stuff remove to keep it shorter...]  rinside_sample16
rm -vrf *.dSYM
edd@rob:~/git/rinside/inst/examples/standard$ make -f GNUmakefile rinside_sample0
ccache g++ -I/usr/share/R/include -I/usr/local/lib/R/site-library/Rcpp/include \
           -I/usr/local/lib/R/site-library/RInside/include -g -O3 -Wall -pipe \
           -Wno-misleading-indentation -Wno-unused \
           -Wno-ignored-attributes -Wno-deprecated-declarations \
           -march=native -Wall  rinside_sample0.cpp  -Wl,--export-dynamic \
           -fopenmp -Wl,-Bsymbolic-functions -Wl,-z,relro -L/usr/lib/R/lib -lR \
           -lpcre -llzma -lbz2 -lz -lrt -ldl -lm -licuuc -licui18n \
           -lblas -llapack  -L/usr/local/lib/R/site-library/RInside/lib \
           -lRInside -Wl,-rpath,/usr/local/lib/R/site-library/RInside/lib \
           -o rinside_sample0
edd@rob:~/git/rinside/inst/examples/standard$ ./rinside_sample0 s
Hello, world!
edd@rob:~/git/rinside/inst/examples/standard(master)$ 

Я сделал отступ вручную, и у меня могут быть некоторые локальные настройки в ~/.R/Makevars, которые отображаются здесь - это не имеет значения.

Важно то, что он работает из коробки, если его просто не трогать. Если вы измените настройку, и она сломается, вы решите проблему, которую вам не нужно было создавать с самого начала.

person Dirk Eddelbuettel    schedule 24.04.2018
comment
Большое спасибо за ваш ответ! Вот уже третий день борюсь с этим. Дело в том, что я установил RInside из CRAN, используя install.packages(), а GNUmakefile не было в каталоге, я установил сейчас из Github и запустил его, как вы сказали. - person msanavarro; 24.04.2018
comment
Когда вы устанавливаете из CRAN, inst/ исчезает из пути, каталог examples/ и его подкаталоги все еще будут там - со всеми GNUmakefile. - person Dirk Eddelbuettel; 25.04.2018