Frage

Ich erstelle ein Paket, das durch R (das statistische Programm) verwendet werden soll, ich bin kein Experte mit dieser Anwendung, aber ich habe ein sehr einfaches Paket zu erstellen, verwaltet, die folgende Logik, ich habe einige Klassen in C ++, wie der Code die R-Compiler werden muss zusammengestellt werden und ermöglicht nur C-Code, habe ich einen Wrapper C-Code, der die C ++ Methoden aufrufen, und später habe ich eine R-Skript, das die Methoden der C ausgesetzt nennen Code, so dass im Grunde ist eine Kommunikation wie R <-> C <->. C ++

Der vollständige Tutorial, das ich verwenden, um dieses Paket zu erstellen, wird gefunden hier , füge ich es als Referenz.

Nun mein Problem ist, dass ich einige Funktionen zum Paket hinzufügen muß, dass ich bereits erstellt, was ich tun muß, ist Bindung an ein COM-Objekt für die späten Code hinzufügen, die ein anderes Produkt, das ich erstellt und registriert mit regasm Werkzeug.

Dies ist der c ++ Code, den ich zu spät bindet an das COM-Objekt, um zu versuchen bin mit, ich versuche IDispatch zu verwenden, dies zu tun:

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

Ich habe nicht den ganzen Code einfügen, da nur mit diesen Zeilen die Compiler ich plage bereits geben, der Befehl, den ich zu kompilieren verwenden ist

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

Wo "Cclass.cc" hat die C-Code, der die C ++ Methoden aufrufen und "C ++ class.cc" ist eigentlich der C ++ Code.

Wenn ich kompilieren diese Klassen der Compiler sagt

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

I "m sicher, dass ich habe alle Header-Dateien hinzugefügt, die ich brauche, das ist, warum ich mein Problem glauben, dass ich nicht mit Ole32.lib und Oleaut32.lib bin, die sind statische Bibliotheken.

Also, meine Frage ist, wie kann ich diese Bibliotheken umfassen, um die Methoden für die späte Bindung verwenden zu können, wie CLSIDFromProgID (...) oder Query-Interface (...). Auch wenn jemand glaubt, dass mein Problem ist das nicht Bibliotheken verknüpfen, sondern etwas anderes, es wäre toll, wenn ich darauf hinweisen kann, auf die mein Problem sein kann.

Sie auch daran, dass ich mit den Statik-Bibliotheken in einer Art und Weise verbinden müssen, dass sie ohne Probleme durch den R-Compiler kompiliert werden kann, die, wenn ich mich nicht falsch ist lediglich C-Compiler.

War es hilfreich?

Lösung

Ich habe dies nicht zu tun versucht, mit C / C ++, sondern mit Fortran. Ich hatte ein ähnliches Problem, dass einige Standard-IO-Bibliotheken wurden nicht in der Bibliothek enthalten sind ich erstellt wurde. Am Ende habe ich eingeschlossen sie einfach alle und mit dem Fortran-Compiler kompiliert. Ich habe keine der R-Compiler-Dienstprogramme, die kompiliert, als ob ich mit irgendetwas anderem eine statische Fortran Bibliothek normalerweise zur Verwendung Kompilieren wurden. Das hat gut funktioniert.

Ein Debug-Pfad als eine statische Bibliothek zu kompilieren, könnte sein, gcc (oder was auch immer Sie verwenden) dann versuchen, diese statische Bibliothek von einem anderen C-Programm zu schließen und ruft, dann, wenn das mit R arbeitet versuchen.

Hope dies hilfreich ist, diese R-Pakete zu schreiben ist ziemlich schwer, wenn Sie Vanille-C oder Fortran so weit verwenden, wie ich sagen kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top