Получение примера RInside для работы с дополнительной опцией компоновщика -framework

Я получил пример 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

1

Решение

Фреймворки — это более или менее 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 аргумент и для -основной аргумент.

1

Другие решения

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 и его библиотеку.

1

По вопросам рекламы [email protected]