Создание пакета ar с DLL на C ++ в Windows и обеспечение переносимости в Linux - PullRequest
5 голосов
/ 09 сентября 2010

Работая в Windows, я создал пакет r, который ссылается на c ++ dll как общую библиотеку.Это прекрасно работает и без проблем устанавливается на Windows.Однако, когда я переключаюсь на Linux, он не обнаруживается.

Правильно ли я считаю, что единственным файлом в каталоге src должен быть файл .cpp?

Нужно ли мневыполнить команду SHLIB в этом каталоге до создания пакета?

В NAMESPACE я использую:

useDynLib(myc.cpp,my.c.function)

и в вызове функции:

my.r.f <- .Call(my.c.function, a, b)

На Windows работает R CMD проверка работает нормально.Может быть, виновата моя конфигурация Linux R?Кажется, для установки сторонних пакетов отлично.

Я в тупике!

Ответы [ 3 ]

2 голосов
/ 09 сентября 2010

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

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

1 голос
/ 13 сентября 2010

Я воспользовался советом Дирка и просмотрел несколько пакетов в CRAN.

Обычный подход заключается в использовании useDynLib (имя_пакета), как предложено mbq в файле NAMESPACE.Затем я использовал вызов:

.Call("my.c.function", a, b, package="package_name")

в коде R, как это было предложено Джошуа.

Теперь устанавливается и отлично работает на Linux и Windows: -)

Я думаюЯ скоро переключусь на Rcpp, так как скелетные инструменты компиляции и сборки пакетов in-R выглядят очень заманчиво.

Спасибо всем!

1 голос
/ 09 сентября 2010

Я думаю, вы должны просто использовать useDynLib(myc) ... Поиск символов выполняется внутри.
РЕДАКТИРОВАТЬ: Другая вещь - это имя этого объектного файла - я думаю, что стандартный make-файл просто называет его именем пакетатак что должно быть скорее useDynLib(<package name>).По крайней мере, это всегда работает для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...