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

Я установил R через RPM (с Yast).

anisha@linux-y3pi:~> locate RInside.so
/usr/lib64/R/library/RInside/lib/libRInside.so
/usr/lib64/R/library/RInside/libs/RInside.so

anisha@linux-y3pi:~> locate Rcpp.so
/usr/lib64/R/library/Rcpp/lib/libRcpp.so
/usr/lib64/R/library/Rcpp/libs/Rcpp.so

Файл (rinsidetest.cpp), который я хочу скомпилировать, содержит:

#include <RInside.h>
#include <Rcpp.h>

int main (int argc, char *argv[])
{
    RInside R (argc, argv);
    return 0;
}

Вот как я его компилирую:

anisha@linux-y3pi:~> g++ rinsidetest.cpp -I /usr/lib64/R/library/RInside/include/ -I /usr/lib64/R/library/Rcpp/include/ -I /usr/lib64/R/include/ -L /usr/lib64/R/library/RInside/libs/ -L /usr/lib64/R/library/Rcpp/libs/ 

/tmp/ccUfdjgZ.o: In function `main':  
rinsidetest.cpp:(.text+0xb7): undefined reference to `RInside::RInside(int, char const* const*, bool)'  
rinsidetest.cpp:(.text+0xc8): undefined reference to `RInside::~RInside()'  
collect2: ld returned 1 exit status

R информация:

> sessionInfo() 
R version 2.15.1 (2012-06-22)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=C                 LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] tcltk_2.15.1 tools_2.15.1
> 

RInside версия: 0.2.6
Rcpp версия: 0.9.13

Есть ли обходной путь для этой проблемы, или мне "придется" удалить установку rpm и начать все путем компиляции из исходного кода?

РЕДАКТИРОВАТЬ

anisha@linux-y3pi:~/Desktop/abc> g++ rinsidetest.cpp -I /usr/lib64/R/library/RInside/include/ -I /usr/lib64/R/library/Rcpp/include/ -I /usr/lib64/R/include/ -L /usr/lib64/R/library/RInside/lib/ -L /usr/lib64/R/library/Rcpp/lib/ -lRInside

anisha@linux-y3pi:~/Desktop/abc> ls  
a.out  rinsidetest.cpp

anisha@linux-y3pi:~/Desktop/abc> ./a.out   
./a.out: error while loading shared libraries: libRInside.so: cannot open shared object file: No such file or directory


person Aquarius_Girl    schedule 18.07.2012    source источник


Ответы (2)


Попробуйте добавить следующее в конец сборки g++

 -lRInside -lRcpp

так что у вас есть

g++ rinsidetest.cpp -I /usr/lib64/R/library/RInside/include/ -I /usr/lib64/R/library/Rcpp/include/ -I /usr/lib64/R/include/ -L /usr/lib64/R/library/RInside/libs/ -L /usr/lib64/R/library/Rcpp/libs/ -lRInside -lRcpp

В нынешнем виде не похоже, что вы ссылаетесь на нужную вам библиотеку. Когда у вас есть библиотека с именем libXYZ, вам нужно связать ее с помощью g++ с -lXYZ, что, похоже, вы еще не сделали. Это может решить проблему

person mathematician1975    schedule 18.07.2012
comment
спасибо, это помогло как-то. Я добавил новый вывод в вопрос. Теперь я получаю сообщение об ошибке при запуске a.out. Скажите, пожалуйста, какой смысл мне все еще не хватает? - person Aquarius_Girl; 18.07.2012
comment
это другая проблема. Бинарный файл успешно собран, но похоже, что Linux не может загрузить .so. Это может быть проблема с путем, которую вам нужно добавить. Я бы опубликовал НОВЫЙ вопрос для этой проблемы, но добавил бы тег c++ вместо тега r, поскольку сообщество C++ больше. Я не уверен, как вы говорите Linux, где искать загрузку файлов .so. Однако ваша компиляция сработала, но это проблема времени выполнения. В качестве временного исправления вы можете попробовать скопировать свои библиотеки в каталог /usr/lib/ как ВРЕМЕННОЕ решение, чтобы посмотреть, сможете ли вы запустить его, поскольку exe должен забрать из этого каталога. - person mathematician1975; 18.07.2012
comment
@AnishaKaul или даже скопируйте в локальный каталог, в котором находится ваш двоичный файл - person mathematician1975; 18.07.2012
comment
@AnishaKaul Возможно, вам лучше задать вопрос на форуме Linux, чтобы спросить, как заставить механизм загрузки .so выбирать ваши каталоги. - person mathematician1975; 18.07.2012
comment
Вы можете либо установить переменную LD_LIBRARY_PATH в каталог, содержащий разделяемую библиотеку (это часто используется для тестирования или когда у вас нет root-доступа), либо вы можете добавить ее в /etc/ld.so.conf и запустить ldconfig. - person Vincent Zoonekynd; 18.07.2012
comment
Пакет предоставляет более простой способ, см. Мой ответ. - person Dirk Eddelbuettel; 18.07.2012

Если вы сбросите свой новый тестовый файл

rinsidetest.cpp

в каталог, содержащий подготовленный Makefile -- например, examples/standard/, тогда вам нужно только сказать

make

и правильный исполняемый файл будет построен. Он решает проблему связывания во время выполнения, встраивая каталог.

Идея состоит в том, чтобы пользователи брали предоставленный Makefile и адаптировали/копировали по мере необходимости.

person Dirk Eddelbuettel    schedule 18.07.2012
comment
Вы должны работать с этим Makefile и адаптировать его по мере необходимости, если вам потребуются сторонние библиотеки и т. д. Вы можете скопировать Makefile в любой другой каталог по своему усмотрению. - person Dirk Eddelbuettel; 18.07.2012
comment
Да, спасибо. и я только что скомпилировал программу RgoogleMaps в RInside. Это сработало очень хорошо. Спасибо. - person Aquarius_Girl; 18.07.2012
comment
Я думаю, вы не скомпилировали RgoogleMaps. Вы написали программу, содержащую вызов функций R для загрузки RgoogleMaps. Это другое. - person Dirk Eddelbuettel; 18.07.2012
comment
Я сказал I've just compiled ***RgoogleMaps program***, что то же самое, что и вы. :) Или, возможно, какие-то проблемы с английским с моей стороны. - person Aquarius_Girl; 18.07.2012