2012-07-18 3 views
1

J'ai installé R à RPM (avec Yast).Compilation du programme RInside avec g ++ sous Linux

[email protected]:~> locate RInside.so 
/usr/lib64/R/library/RInside/lib/libRInside.so 
/usr/lib64/R/library/RInside/libs/RInside.so 

[email protected]:~> locate Rcpp.so 
/usr/lib64/R/library/Rcpp/lib/libRcpp.so 
/usr/lib64/R/library/Rcpp/libs/Rcpp.so 

Le fichier (rinsidetest.cpp) que je souhaite compiler contient:

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

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

Voilà comment je le compiler:

[email protected]:~> 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 informations:

> 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 Version: 0.2.6
Rcpp Version: 0.9.13

est-il une solution à ce problème, ou je "dois" supprimer l'installation de tours par minute et commencer tout en compilant de la source?

EDIT

[email protected]:~/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 

[email protected]:~/Desktop/abc> ls 
a.out rinsidetest.cpp 

[email protected]:~/Desktop/abc> ./a.out 
./a.out: error while loading shared libraries: libRInside.so: cannot open shared object file: No such file or directory 

Répondre

2

Essayez d'ajouter ce qui suit à la fin de votre g ++ construire

-lRInside -lRcpp 

afin que vous ayez

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 

En l'état actuel, il ne marche pas apparaître que y Vous faites un lien vers la bibliothèque dont vous avez besoin. Lorsque vous avez une bibliothèque nommée libXYZ, vous devez lier à l'aide de g ++ avec -lXYZ qu'il semble que vous n'avez pas fait. Cela peut résoudre le problème

+0

merci, cela a aidé d'une manière ou d'une autre. J'ai ajouté le nouveau résultat dans la question. Je reçois maintenant une erreur lors de l'exécution de 'a.out'. S'il vous plaît dites-moi quel est le point que je manque toujours? –

+0

c'est un problème différent. Le binaire a été construit avec succès, mais il semble que Linux ne puisse pas charger le fichier .so. C'est peut-être un problème de chemin que vous devez ajouter. Je publierais une nouvelle question pour ce problème, mais ajouter la balise C++ au lieu de la balise r que la communauté C++ est plus grande. Je ne suis pas sûr comment vous dites à Linux où chercher .so le chargement des fichiers. Votre compilation a cependant fonctionné mais c'est un problème d'exécution.Comme solution temporaire, vous pouvez essayer de copier vos bibliothèques dans le répertoire/usr/lib/en tant que solution TEMPORAIRE pour voir si vous pouvez ensuite les exécuter car l'exe doit récupérer ce répertoire. – mathematician1975

+0

@AnishaKaul ou même copier dans le répertoire local binary is in – mathematician1975

2

Si vous laissez tomber votre nouveau fichier de test

rinsidetest.cpp 

dans un répertoire contenant le Makefile préparé - comme par exemple examples/standard/, alors vous ne devez dire

make 

et le bon exécutable sera construit. Il prend en charge le problème de liaison au moment de l'exécution en intégrant le répertoire.

L'idée est que les utilisateurs prennent le fichier Makefile fourni et adaptent/copient au besoin.

+0

Très reconnaissant envers vous. Cela fonctionne en effet. –

+0

Vous devriez travailler à partir de ce Makefile et l'adapter est nécessaire si vous avez besoin de bibliothèques tierces, etc. Vous pouvez copier le Makefile dans un autre répertoire comme bon vous semble. –

+0

oui, merci. et je viens de compiler le programme RgoogleMaps dans RInside. Cela a très bien fonctionné. Merci. –

Questions connexes