Как заставить работать компоновщики, когда я включаю заголовок 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
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 ответ
Я не уверен, где вы потерялись, но основная идея состоит в том, чтобы просто сказать это:
- Перейдите в каталог.
make clean
так, на всякий случай.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
которые появляются здесь - это не имеет значения.
Важно то, что это работает из коробки, если вы просто оставите это в покое. Если вы измените настройку, и она сломается, вы сможете решить проблему, которую вам не нужно было создавать.