Rcpp'yi BayesOpt C++ kütüphanesinden işlevselliğe genişletmek için Rcpp'yi kullanmaya çalışıyorum. Uzun süreli bir R kullanıcısıyım ancak C++ için yeni ve çalışıyorum. bazı problemlere. Bir paket kurmak için Rcpp vinyetlerini takip ettim, ki bu da dış C++ kitaplıklarını getirmenin en iyi yoludur.Rcpp: Paylaşılan nesneyi yükleyemiyor, tanımsız sembol
BayesOpt klasörüne ve kütüphanesine PKC_CPPFLAGS ve PKG_LIBS seçeneklerini src/Makevars'a ekledim ve baysOpt bazı başlık dosyaları için #include kullanan tek bir .cpp dosyası (call it test.cpp) src/var. Bu dosyada, vermek istediğim işlevin üzerinde // [[Rcpp::export]]
var.
R CMD check mypackage
çalıştırdığımda, kitaplık başarıyla çalışıyor gibi görünüyor - günlüğe bakarak, her şey "yüklü" olan paketi yüklemeye çalışana kadar iyi gider. Sonra, hata günlüğüne
** testing if installed package can be loaded
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object '/home/me/p3/mypackage.Rcheck/mypackage/libs/mypackage.so':
/home/me/p3/mypackage.Rcheck/mypackage/libs/mypackage.so: undefined symbol: _ZTIN8bayesopt13DiscreteModelE
'u aldım. echo _ZTIN8bayesopt13DiscreteModelE | c++filt
, bayesOpt üstbilgilerini kullanan test.cpp dosyasındaki ilk nesne olan typeinfo for bayesopt::DiscreteModel
değerini verir. Buna bir çözüm için yüksek ve düşük baktım, ama bir tane bulamıyorum. Makevarların kütüphanede doğru bir şekilde işaret ettiğine inanmak isterim, çünkü ilk kurulum kontrolü sırasında başlık dosyalarını bulabilir - bu sadece aday paketini tanımlarken bu tanımlanmamış sembol hatası alırken. Dış kütüphaneleri kullanan bir Rcpp örneğine baktım, ama baktığım cevaplarda bir Dirk, RcppGSL
, Makevars'ı dolduran 3500+ satırlık bir betik çizdi ve ayrıştırması biraz zor. .
Kimsenin yardımına minnettarım - son çare herşeyi src
içine dökmek ama bu zaten hantal ve daha da zarif bir şekilde organize edilmiş bir kütüphane için zarif görünüyor.
Hızlı ve eksiksiz yanıt için teşekkürler Dirk. Her iki yoldan devam etmeden önce - Rcpp ile R paketlerini geliştirirken bir sistem kurulumunu arayarak C++ kaynak kodunu bir statik kitaplık olarak paketlemeye göre "en iyi uygulama" var mı? C++ kütüphanesi daha "ortak" olduğunda sistem kurulumlarını aramak belki daha pratik midir? – user2476581
Tam olarak. Daha özel bir kütüphaneyle çalışırken, genellikle onu paketlemeniz gerekir. Biraz daha fazla iş, biraz daha uzun bir derleme zamanı, ama siz aslında kendiniz yerdesiniz. –
Tamam, bunu statik bir kütüphaneye dönüştürmeye karar verdim. Birkaç takip: 1. Statik kütüphaneyi "mypackage/inst" veya "mypackage/src" 'ye, pratik olarak mı kurmalıyım? Her iki durumda da 'R CMD mypackage'ı çalıştırdığımda, kütüphanelerin bir kaynak pakete dahil edilmemesi gerektiği uyarısını da aldım. Bu uyarı kullanım durumumla alakasız mı? – user2476581