2013-10-15 32 views
2

我查看了多個地方(例如Writing R ExtensionsWriting a package using Rcpp),但未能找到我的問題的簡單示例。
我需要的是能夠使用多個cpp源文件。 一個簡單的例子是:
可以說我有一對文件:a.h,a.cp​​p,它定義了函數f(它爲我準備了一些數據)。
然後我有b.cpp其中包括a.h.它所做的是定義一個導出到R的函數g(即,這是包含Rcpp.h的唯一文件)。這個函數調用f,然後返回它從f創建的數據框。

在rcpp中使用多個源文件

我需要一種方法來編譯a.cpp,將它鏈接到b.cpp(因此它可以調用f)然後運行g。
在實踐中,而不是一對a.cpp,a.h我有一個項目,我做外部(使用Linux上的makefile)。然而,相同的文件應該被編譯並鏈接到Windows上的b.cpp(我知道他們使用g ++正確編譯)。當我創建makefile時,我添加了幾個標誌(幾個-I標誌來定義include目錄和幾個-D標誌來定義行爲)。
雖然我不能真正觸及原始項目,只能使用b.c並添加外部文件。

我正在尋找一種簡單的方法來完成此操作。我看到的最接近的是創建一個包含使用Rcpp.package.skeleton的文件的包。有幾個問題這種方法雖然:

  1. 我需要參考相關的文件,但Rcpp.package.skeleton複製它們。大多數cpp文件(即與R有關的所有記事)屬於不同的項目,它在我們的倉庫中有自己的位置,我不想去碰它們(我也不能使用軟鏈接,因爲我們使用混合的Windows環境和linux)。

  2. 我不喜歡,因爲它似乎是我的簡單的需求

我看到它是可以鏈接外部庫有點複雜創建一個單獨的包,但我不知道如何以與R兼容的方式編譯它(特別是在Windows中)。

唯一的簡單的解決辦法,我發現到目前爲止是直接包括所有相關的cpp文件轉換爲R相關的CPP(即b.cpp的開始,因爲文件的列表中添加的#include「a.cpp」不會真的改變,我不介意每次編譯的東西)並在使用sourceCpp之前執行Sys.setenv(「PKG_CXXFLAGS」= myflags)。

我寧願找到一個更優雅(而不是太複雜)的解決方案。

回答

1

您錯過了將頭文件放入mypackage/inst/include以便它們安裝在mypackage/include中的可能性。

隨後的使用可以簡單地具有LinkingTo: mypackageDepends屬性。查找示例以及Rcpp庫中或此處的許多RcppArmadillo使用示例 - 無複製文件。

+0

從我的理解LinkingTo只適用於其他文件在R包中。在我的情況下,CPP文件不是,他們在一個單獨的目錄(爲此我有一個Visual Studio項目和Linux的makefile文件)。 –

+0

你沒有解釋爲什麼你不能只創建一個庫。 –

+0

如何創建與R兼容的庫?在Windows中,我通常使用visual studio,並在linux中使用自己的邏輯創建一個.a(沒有R相關標誌)。我只使用常規的linux makefile來創建一個常規的.a庫嗎? –