Компиляция пакета Rcpp

Фон

Моя компания думает о внедрении R в нашу рабочую среду вместе с RStudio. В рамках проверок безопасности мы должны скомпилировать каждый из различных файлов C/C++ в пакете для поиска возможных недостатков безопасности. Я знаю, что двоичные файлы доступны, и я действительно хочу, чтобы я мог их использовать, но мы должны скомпилировать сами. У меня нет опыта работы с R и немного опыта работы с C++ около 5 лет назад. Я пытаюсь скомпилировать только код Rcpp C++, и я не знаю, возможно ли это.

Что я пробовал

Сначала я попытался скомпилировать с использованием VisualStudio и обнаружил, что он не совместим с c99. Затем я попробовал Cygwin, и он не поддерживал w_strings, Теперь я установил Ubuntu и получаю много "неопределенных ссылок" при компиляции. Я знаю (или, по крайней мере, я верю), что Rcpp разработан, чтобы помочь использовать C++ в R. Учитывая это, могу ли я даже скомпилировать некоторые из этих файлов как отдельный двоичный файл?

Некоторые из нулевых ссылок, которые я получаю при компиляции api.cpp (Я не верю, что полный список предоставит больше информации, чем частичный, поскольку он довольно длинный):

undefined reference to 'R_NilValue'
undefined reference to 'REprintf'
undefined reference to 'R_FlushConsole'
undefined reference to 'Rf_install'
undefined reference to 'Rf_setAttrib'
undefined reference to 'Rf_mkChar'
undefined reference to 'SET_STRING_ELT'
undefined reference to 'Rf_allocVactor'
undefined reference to 'R_ExternalPtrAddr'
etc...

Прямо сейчас я предполагаю, что это не работает, потому что я не использую Rcpp так, как он предназначен, и передаю какие-либо значения. Если бы я попытался использовать другой пакет R, который использует Rcpp, это скомпилировало бы файлы Rcpp C++ и оставило бы двоичные файлы? Есть ли что-нибудь, что я могу сделать, кроме как просто снять двоичные файлы с CRAN?

Решение

На самом деле это было относительно простое решение, которое я не смог найти где-либо еще, хотя большинство людей просто смогут загружать двоичные файлы, так что это не будет иметь значения.

1) Скачать с CRAN (не apt-get, который у меня не работал)

2) sudo tar -xvf Rcpp_X.XX.X.tar.gz

3) R CMD УСТАНОВИТЬ Rcpp

Это создаст двоичный файл.SO для вас.

2 ответа

Решение

Быстрые:

  • Это пишется Rcpp, то есть заглавная R, а затем строчные cpp. Как расширение файла.

  • Вы сделали героическое предположение, что Rcpp может быть скомпилирован Visual Studio [1]. Это не может [2]. И мы задокументировали это буквально в течение многих лет, то есть как минимум с конца 2008 года, когда я перезапустил Rcpp.

  • См., Например, записи 1.3 и 2.9 из FAQ по Rcpp, который поставляется с каждой загрузкой Rcpp.

  • То же самое для Cygwin. R не строит под Cygwin. Поэтому не пытайтесь собрать Rcpp под Cygwin.

  • И последнее, но не менее важное: не знаете, насколько внимательно вы ознакомились с документацией по Rcpp и для чего она нужна. Это не волшебная пони, которая конвертирует R-скрипты в двоичные файлы Windows для вас. Такой пони не существует. Rcpp - это пакет расширений для R, который облегчает обмен R и C++. Не больше, не меньше. К настоящему времени здесь есть несколько сотен Rcpp вопросов, так что посмотрите вокруг, чтобы почувствовать.

Все это также почти наверняка повторный вопрос, который можно было бы закрыть, но сейчас у меня нет времени смотреть.

[1] Обратите внимание на единственное число здесь, это не множественное число "Visual Studios", или, может быть, вы имеете в виду что-то кроме компилятора и IDE от компании с северо-запада Тихого океана.

[2] Если вы не являетесь настоящим экспертом в C++- на Windows и не хотите более или менее создавать свою собственную систему сборки [3]

[3] Все это, по сути, связано с тем, что R не может собрать с помощью VS toolchain. И божество знает, что люди пытались. Здесь вина лежит на стороне поставщика ОС / компилятора за несоблюдение стандартов, которые позволяют команде R Core предоставлять согласованный продукт для Windows (через gcc), OS X и, по существу, для всех разновидностей Unix, включая все варианты Linux.

Я пробовал компилировать rcpp на Visual Studio, и дошло до 5 ошибок связывания, таких как

неразрешенный внешний символ Rf_allocVector и неразрешенный внешний символ Rf_length

Знаете ли вы, какой файл, который я сделал, нужно добавить в проект для устранения ошибок компоновки?

Я преодолел ошибки компиляции. Я не утверждаю, что у меня есть полный ответ, но я не смог добавить это как комментарий, потому что мой рейтинг репутации недостаточно высок.

Я сделал замену целого слова с учетом регистра OUT -> RCPP_TYPE_OUT а также Class -> RCPP_TYPE_Class,

Поскольку я обычно воспринимаю предупреждения как ошибки, я добавил препроцессор macro

#define _CRT_SECURE_NO_WARNINGS
#define __INTEL_COMPILER 

Я также проигнорировал предупреждение 4996 и произнес size_t в int в одном файле.

Перед включением rcpp.h, Я использовал #undef для макросов ERROR, min и max.

Другие вопросы по тегам