Obtenir que l’exemple RInside fonctionne avec l’option de liens supplémentaire -framework

L’exemple RInside s’exécutait et fonctionnait, mais je devais append manuellement l’éditeur de liens: “-F / Bibliothèque / Frameworks / R.framework / .. -framework R” à la fin pour g ++ (sous Mac Snow Leopard 10.6.8 avec Xcode 3.x). Cela fonctionne, mais je ne sais pas pourquoi. Quelqu’un peut-il dire ce que font réellement ces options? Je ne pouvais pas le trouver sur cette liste: http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

Voici le code original:

#include  // for the embedded R via RInside int main(int argc, char *argv[]) { RInside R(argc, argv); // create an embedded R instance R["txt"] = "Hello, world!\n"; // assign a char* (ssortingng) to 'txt' R.parseEvalQ("cat(txt)"); // eval the init ssortingng, ignoring any returns exit(0); } 

Voici l’appel de l’éditeur de liens tel que je l’ai vu dans NetBeans:

g ++ -o dist / Debug / GNU-MacOSX / vocation de construction / Debug / GNU-MacOSX / main.o – L / Bibliothèque / Frameworks / R.framework / Ressources / lib -L / Bibliothèque / Frameworks / R.framework / Ressources / bibliothèque / Rcpp / lib -L / Bibliothèque / Frameworks / R.framework / Ressources / library / RInside / lib -L / Bibliothèque / Frameworks / R.framework / Bibliothèques -L / Bibliothèque / Frameworks / R.framework / Resources / lib – L / Bibliothèque / Frameworks / R.framework / Ressources / library-L / Bibliothèque / Frameworks / R.framework / Ressources / modules -lRcpp -lRInside -lRlapack -lRblas -F / Bibliothèque / Frameworks / R.framework / .. -framework R

La dernière partie est ce que je devais append manuellement. Sans cela, j’ai eu deux erreurs de couplage:

 Undefined symbols: "_Rf_mkSsortingng", referenced from: Rcpp::wrap(char const*)in main.o "_R_NilValue", referenced from: Rcpp::wrap(char const*)in main.o 

Les frameworks sont, plus ou moins, une manière de comstackr des applications sur Mac. Ces applications peuvent contenir le code + les en-têtes + les bibliothèques que nous voulons utiliser. La ligne

 -F/Library/Frameworks/R.framework/.. 

“Rechercher dans le dossier /Library/Frameworks les structures spécifiées”, et

 -framework R 

dit: “cherchez le dossier R.framework dans l’ensemble des répertoires ‘frameworks'”.

Notez que l’argument -framework R est en fait géré par ld , pas par gcc / clang , vous trouverez donc plus d’informations dans man ld . L’argument -F , en revanche, est géré par gcc / clang . Ensemble, ils permettent à votre compilateur et à votre éditeur de trouver les en-têtes et les bibliothèques nécessaires.

En particulier, sur Mac, ils se trouvent (par défaut) sous les /Library/Frameworks/R.framework/Headers et /Library/Frameworks/R.framework/Libraries – ce sont les répertoires explorés en définissant les indicateurs de structure appropriés.

Plus d’informations sont disponibles ici pour l’ argument -F et pour l’ argument -framework .

RInside nécessite R car il intègre R.

C’est pourquoi vous obtenez des erreurs d’éditeur de liens sur les identificateurs de base R manquants quand il n’est pas présent.

Maintenant, je ne sais pas pourquoi ces instructions de lien étaient absentes. Notre Makefile dans le répertoire examples/standard (d’où provient ce premier exemple) utilise

 LDLIBS := $(RLDFLAGS) $(RRPATH) $(RBLAS) $(RLAPACK) $(RCPPLIBS) $(RINSIDELIBS) 

et toutes ces variables sont définies dans le Makefile lui-même. Celui-ci est

 RLDFLAGS := $(shell $(R_HOME)/bin/R CMD config --ldflags) 

et cela aurait dû inclure R et sa bibliothèque.