Как заставить работать компоновщики, когда я включаю заголовок 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 к тому же make-файлу из пункта 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. Любая помощь будет оценена!

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 которые появляются здесь - это не имеет значения.

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

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