Я получил пример RInside для запуска и работы, но мне пришлось вручную добавить опцию компоновщика:
«-F / Library / Frameworks / R.framework / .. -framework R» в конце для g ++ (на Mac Snow Leopard 10.6.8 с Xcode 3.x). Это работает, но я не знаю почему. Может кто-нибудь сказать, что эти варианты
на самом деле делать? Я не мог найти это в этом списке: http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html
Вот оригинальный код:
#include <RInside.h> // 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* (string) to 'txt'
R.parseEvalQ("cat(txt)"); // eval the init string, ignoring any returns
exit(0);
}
Вот вызов компоновщика, как я видел его в NetBeans:
g ++ -o dist / Debug / GNU-MacOSX / callrproject build / Debug / GNU-MacOSX / main.o — L / Библиотека / Frameworks / R.framework / Ресурсы / lib -L / Библиотека / Frameworks / R.framework / Resources / библиотека / Rcpp / lib -L / библиотека / фреймворки / R.framework / ресурсы / библиотека / RInside / lib -L / библиотека / фреймворки / R.framework / библиотеки -L / библиотека / фреймворки / R.framework / ресурсы / lib — L / Библиотека / Каркасы / R.framework / Ресурсы / Библиотека -L / Библиотека / Каркасы / R.framework / Ресурсы / Модули -lRcpp -lRInside -lRlapack -lRblas -F / Библиотека / Каркасы / R.framework / .. -рамка р
Последняя часть — это то, что мне пришлось добавить вручную. Без этого я получил эти две ошибки связи:
Undefined symbols:
"_Rf_mkString", referenced from:
Rcpp::wrap(char const*)in main.o
"_R_NilValue", referenced from:
Rcpp::wrap(char const*)in main.o
Фреймворки — это более или менее Mac-способ упаковки приложений. Эти приложения могут содержать код + заголовки + библиотеки, которые мы хотим использовать. Линия
-F/Library/Frameworks/R.framework/..
говорит «посмотри в папке /Library/Frameworks
для любых каркасов, которые указываются «, и
-framework R
говорит: «ищи папку R.framework
в наборе каталогов «рамки».
Обратите внимание, что -framework R
аргумент на самом деле обрабатывается ld
не gcc
/clang
так что вы найдете больше информации в man ld
, -F
аргумент, с другой стороны, является обрабатывается gcc
/clang
, Вместе они позволяют вашему компилятору и компоновщику находить необходимые заголовки и библиотеки.
В частности, на Mac они расположены (по умолчанию) как /Library/Frameworks/R.framework/Headers
а также /Library/Frameworks/R.framework/Libraries
— это каталоги, которые проверяются путем установки соответствующих рамочных флагов.
Более подробная информация доступна здесь для -F аргумент и для -основной аргумент.
Rinside требует R, поскольку он встраивает R.
Вот почему вы получаете ошибки компоновщика об отсутствии основных идентификаторов R, когда их нет.
Теперь я не знаю, почему эти ссылки инструкции, где нет. наш Makefile
в каталоге examples/standard
(из которого исходит этот первый пример) использует
LDLIBS := $(RLDFLAGS) $(RRPATH) $(RBLAS) $(RLAPACK) $(RCPPLIBS) $(RINSIDELIBS)
и все эти переменные установлены в Makefile
сам. Этот
RLDFLAGS := $(shell $(R_HOME)/bin/R CMD config --ldflags)
и это должно было включать R и его библиотеку.