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

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

получается, что.поэтому файл в хранилище 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 ++ и пару вопросов конкретно оВнутри, на некоторые из которых ответил Дирк Эддельбюттель, который написал пакет, ноt все ответы были связаны с использованием компоновщиков -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 Ответ

0 голосов
/ 24 апреля 2018

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

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

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

...