Domanda

Sto creando un pacchetto che sta per essere utilizzato da R (programma statistico), io non sono un esperto utilizzando questa applicazione, ma sono riuscito a creare un pacchetto molto semplice, utilizzando la seguente logica, ho alcune classi in C ++, come il codice deve essere compilato utilizzando il compilatore R e permette solo il codice C, ho un codice involucro C che chiama i metodi C ++, e successivamente ho uno script R che chiamare i metodi esposti dal C codice, in modo sostanzialmente è una comunicazione come R <-> C <->. C ++

Il tutorial completo che ho usato per creare questo pacchetto si trova qui , aggiungo come riferimento.

Ora il mio problema è che ho bisogno di aggiungere alcune funzionalità al pacchetto che ho già creato, che cosa devo fare è di aggiungere il codice per l'associazione tardiva a un oggetto COM che è un altro prodotto che ho creato e che è stato registrato utilizzando strumento regasm.

Questo è il codice C ++ che sto usando per cercare di ritardo si legano con l'oggetto COM, sto cercando di utilizzare IDispatch per farlo:

{
...
CLSID clsid;    
HRESULT hr = CLSIDFromProgID((WCHAR*)"My Com object ProgId", &clsid);
if(FAILED(hr))                      
  return;   
...     
}

Non ho incolla l'intero codice perché solo con queste linee il compilatore sta dando mi turba già, il comando che uso per la compilazione è

R CMD SHLIB Cclass.cc C++class.cc

Dove "Cclass.cc" ha il codice C che chiamano i metodi e C ++ "C ++ class.cc" è in realtà il codice C ++.

Quando compilo queste classi il compilatore dice

"undefined reference to `CLSIDFromProgID@8'collect2: ld returned 1 exit status"

I "sicuro che ho aggiunto tutti i file di intestazione che ho bisogno, è per questo che credo che il mio problema è che io non sono compresi Ole32.lib e OLEAUT32.LIB che sono librerie statiche.

Quindi, la mia domanda è: come posso includere questo le biblioteche al fine di essere in grado di utilizzare i metodi per l'associazione tardiva, come CLSIDFromProgID (...) o QueryInterface (...). Anche se qualcuno crede che il mio problema non è collegare questo le biblioteche, ma qualcos'altro, sarebbe bello se mi può indicare che il mio problema sia.

Anche avere in mente che ho bisogno di collegamento con tali librerie statica in modo che essi possono essere compilati senza problemi dal compilatore R, che se non sbaglio è un compilatore C solo.

È stato utile?

Soluzione

Non ho provato a fare questo con C / C ++, ma piuttosto con il Fortran. Ho avuto un problema simile in che alcuni librerie standard IO non venivano inclusi nella libreria sono stato creato. Alla fine ho appena li tutto incluso e compilato usando il compilatore Fortran. Non ho usato una delle utility R compilatore, appena compilato come se stessi compilazione di una libreria statica Fortran normalmente per l'utilizzo con qualsiasi altra cosa. Questo ha funzionato bene.

Un percorso di debug potrebbe essere quella di compilare come una libreria statica utilizzando gcc (o qualsiasi altra cosa che si sta utilizzando) quindi provare a includere e chiamare quella libreria statica da un altro programma C, quindi se funziona provare con R.

Spero che questo è utile, scrivere questi pacchetti R è piuttosto difficile a meno che non si sta utilizzando la vaniglia C o Fortran per quanto posso dire.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top