Если я сделаю:
Rcpp::Rcpp.package.skeleton("test1", module = TRUE)
Rcpp::Rcpp.package.skeleton("test2")
Затем в каталоге test1
package src
я сохраню только два файла:
// rcpp_module.cpp
#include <Rcpp.h>
#include "rcpp_module.h"
std::string World::greet(){ return msg; }
RCPP_MODULE(yada){
using namespace Rcpp ;
class_<World>("World")
.constructor() // expose the default constructor
.method("greet", &World::greet , "get the message")
.method("set", &World::set , "set the message")
;
}
и
// rcpp_module.h
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::plugins(cpp11)]]
class World {
public:
World() : msg("hello") {}
void set(std::string msg) { this->msg = msg; }
std::string greet(); // NOTE this is just the declaration
private:
std::string msg;
};
Плюс один вызов loadModule
:
# zzz.R
loadModule("yada", TRUE)
Затем в test2
пакете src
у меня есть один файл:
// rcpp_hello_world.cpp
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::depends(test1)]]
#include "rcpp_module.h"
// [[Rcpp::export]]
List rcpp_hello_world2(SEXP xptr) {
Rcpp::XPtr<World> world_ptr(xptr);
Rcout << world_ptr->greet() << std::endl;
return List::create();
}
test2
имеет test1
в его описании под Depends:
и LinkingTo:
.Я также скопировал test1
rcpp_module.h
в каталог inst/include
.Все же я получаю неопределенный символ при попытке использовать test2
:
Error in dyn.load(dllfile) :
unable to load shared object 'test2/src/test2.so':
dlopen(test2/src/test2.so, 6): Symbol not found: __ZN5World5greetEv
Что я делаю неправильно?