Компиляция пакета 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.