2016-06-14 28 views
5

Sto cercando di creare un pacchetto R con codice Rcpp che utilizza una libreria esterna. In precedenza avevo chiesto a SO come utilizzare una libreria C esterna in un pacchetto here. Il problema che ho di fronte è appena mi includo la seguente riga di codiceCompilazione C++ in Rcpp con libreria C esterna

y = N_VNew_Serial(3); 

sto ottenendo l'errore

sundials_test.o:sundials_test.cpp:(.text+0x2ba): undefined reference to `N_VNew_Serial' 
collect2: ld returned 1 exit status 
Error in Rcpp::sourceCpp("src/sundials_test.cpp") : 
    Error occurred building shared library 

non ottengo un errore con la linea

N_Vector y = NULL; 

quindi, penso che la connessione alla libreria funzioni bene. Ho anche confermato che la dichiarazione di funzione per N_VNewSerial() è nel nvector/nvector_serial.h Nel caso in cui è necessario guardare a tutto il codice di pacchetto, è disponibile here

Il codice per la particolare file Rcpp è pasta sotto

#include <Rcpp.h> 

// #include <iostream.h> 
#include <cvode/cvode.h>    /* prototypes for CVODE fcts., consts. */ 
#include <nvector/nvector_serial.h> /* serial N_Vector types, fcts., macros */ 
#include <cvode/cvode_dense.h>   /* prototype for CVDense */ 
#include <sundials/sundials_dense.h> /* definitions DlsMat DENSE_ELEM */ 
#include <sundials/sundials_types.h> /* definition of type realtype */ 

using namespace Rcpp; 

void InitialConditions (NumericVector x){ 

    N_Vector y = NULL; 
    // y = N_VNew_Serial(3); 
    // 
    // NV_Ith_S(y,0) = 1; 
    // NV_Ith_S(y,1) = 2; 
    // NV_Ith_S(y,2) = 3; 


} 

Non sono sicuro del motivo per cui il codice riporta undefined reference a una funzione, ma non a un'altra nello stesso file di intestazione, e qualsiasi aiuto nella comprensione della risoluzione di questo errore sarebbe molto apprezzato.

Grazie!

SN248

risposta

6

Questo è un collegamento errore e non un errore di compilazione. La compilazione è riuscita a farti accedere alla fase di collegamento. Ma

sundials_test.o:sundials_test.cpp:(.text+0x2ba): \ 
    undefined reference to `N_VNew_Serial' 
collect2: ld returned 1 exit status 
Error in Rcpp::sourceCpp("src/sundials_test.cpp") : 
    Error occurred building shared library 

è molto chiaro: R non può costruire una libreria condivisa, perché non l'hai fatto collegamento contro il codice oggetto (da meridiane, presumo), che fornisce.

+0

Grazie mille per la tua risposta @Dirk. Non so come andrei sul collegamento con il codice oggetto. Potresti aiutare in questo processo? Non ho installato meridiane sulla mia macchina Windows. Sto cercando di creare il pacchetto in modo da non dover installare la libreria, quindi ho incluso tutti i file di origine e di intestazione nel pacchetto stesso. Grazie! – SN248

+0

Bene tu sei [cercando di dichiararli qui] (https://github.com/AleMorales/RcppSundials.R/blob/master/src/Makevars#L5-L21). Forse alcuni file mancano? O forse la dipendenza * non * raggiunge la fase di collegamento? Non so, ma questo è il tuo problema qui. –

+0

Grazie per la risposta, per essere chiari, non è il file 'Makevars' dal mio pacchetto. Il file 'Makevars' del mio pacchetto è - https://github.com/sn248/Rcppsbmod/blob/master/src/Makevars.win, ho avuto l'impressione che per includere una libreria esterna, tutto ciò che dovevo fare era fornire i file header e source da quella libreria e non le librerie condivise create durante l'installazione del pacchetto, ma potrei sbagliarmi qui. Qualsiasi intuizione qui sarebbe molto utile. Grazie! – SN248