2013-10-15 4 views
2

Я просмотрел несколько мест (например, Writing R Extensions и Writing a package using Rcpp), но не смог найти простой пример для моей проблемы.
Мне нужно, чтобы иметь возможность использовать несколько исходных файлов cpp. Простым примером может быть:
Допустим, у меня есть пара файлов: a.h, a.cpp, которые определяют функцию f (которая подготавливает некоторые данные для меня).
Затем у меня есть b.cpp, который включает a.h. Он определяет функцию g, которая экспортируется в R (т. Е. Это единственный файл, который включает Rcpp.h). Эта функция вызывает f, а затем возвращает фрейм данных, созданный из f.

Использование нескольких исходных файлов с rcpp

Мне нужен способ скомпилировать a.cpp, связать его с b.cpp (чтобы он мог вызвать f), а затем запустить g.
На практике вместо пары a.cpp, a.h У меня есть проект, который я сделал извне (используя make-файл на linux). Однако те же файлы должны быть скомпилированы и связаны с b.cpp на окнах (я знаю, что они скомпилированы правильно с помощью g ++). Когда я создал make-файл, я добавил пару флагов (несколько -I флагов для определения каталогов include и нескольких флагов -D для определения поведения).
Я не могу потрогать оригинальный проект, но только b.c и добавление внешних файлов.

Я искал простой способ выполнить это. Самое близкое, что я видел, это создание пакета, который включает файлы с использованием Rcpp.package.skeleton. Есть несколько проблем с этим подходом, хотя:

  1. Мне нужно ссылаться на соответствующие файлы, но Rcpp.package.skeleton копирует их. Большинство файлов cpp (т.е. все примечания, связанные с R) относятся к другому проекту, который имеет свою собственную позицию в нашем репозитории, и я не хочу прикасаться к ним (я также не могу использовать программные ссылки, потому что мы используем смешанную среду окон и linux).

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

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

Единственное простое решение, которое я нашел до сих пор, чтобы включить все соответствующие CPP файлы непосредственно в связанные с R CPP (т.е. добавить #include «a.cpp» в начале b.cpp в списке файлов на самом деле не изменится, и я не возражаю, если все компилируется каждый раз), а затем используйте Sys.setenv («PKG_CXXFLAGS» = myflags) перед использованием sourceCpp.

Я бы предпочел найти более элегантное (и не слишком сложное) решение.

ответ

1

Вы пропустили возможность иметь файлы заголовков в mypackage/inst/include, чтобы они были установлены в mypackage/include.

Последующее использование может просто иметь атрибут LinkingTo: mypackage, или Depends. Посмотрите пример и многочисленные примеры использования RcppArmadillo в галерее Rcpp или здесь - нет файлов для копирования.

+0

Из моего понимания LinkingTo работает только в том случае, если другие файлы находятся в пакете R. Файлы cpp в моем случае не являются, они находятся в отдельном каталоге (для которого у меня есть как проект визуальной студии, так и файл makefile). –

+0

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

+0

Как создать библиотеку, совместимую с R? в окнах я обычно использую визуальную студию, а в linux я создаю .a со своей логикой (нет связанных с R) флагов). Я просто использую обычный make-файл linux для создания обычной библиотеки .a? –

Смежные вопросы