Question

Je crée un paquet qui va être utilisé par R (le programme statistique), je ne suis pas un expert en utilisant cette application, mais j'ai réussi à créer un package très simple, en utilisant la logique suivante, je certaines classes en C ++, que le code doit être compilé en utilisant le compilateur R et il ne permet que le code C, j'avoir un code wrapper C qui appellent les méthodes C ++, et plus tard j'ai un script R qui appellent les méthodes exposées par le C code, si une communication est fondamentalement comme R <-> C <->. C ++

Le tutoriel complet que j'ai utilisé pour créer ce paquet se trouve ici , je l'ajoute comme référence.

Maintenant, mon problème est que je dois ajouter des fonctionnalités au package que je l'ai déjà créé, ce que je dois faire est d'ajouter du code pour la liaison tardive à un objet COM qui est un autre produit que j'ai créé et qui est enregistrée à l'aide outil regasm.

Ceci est le code c ++ que j'utilise pour essayer de se lier à la fin de l'objet COM, je suis en train d'utiliser IDispatch de le faire:

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

Je ne l'ai pas coller tout le code parce que ces lignes le compilateur me donne déjà, la inquiète, ce commandement que j'utilise pour compiler est

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

Où "Cclass.cc" a le code C qui appellent les c ++ et méthodes "C ++ class.cc" est en fait le code C ++.

Quand je compile ces classes le compilateur dit

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

Je "suis sûr que je l'ai ajouté tous les fichiers d'en-tête que j'ai besoin, c'est pourquoi je crois que mon problème est que je ne suis pas compris Ole32.lib et oleaut32.lib qui sont les bibliothèques statiques.

Alors, ma question est, comment puis-je inclure ces bibliothèques afin de pouvoir utiliser les méthodes de liaison tardive, comme CLSIDFromProgID (...) ou QueryInterface (...). Aussi, si quelqu'un pense que mon problème est ne pas lier ces bibliothèques, mais quelque chose d'autre, ce serait bien si peut me indiquer que mon problème peut être.

ont également à l'esprit que je dois faire le lien avec les bibliothèques statics d'une manière qu'ils peuvent être compilés sans problème par le compilateur R, qui, si je ne me trompe pas est un compilateur simplement c.

Était-ce utile?

La solution

Je n'ai pas essayé de faire cela avec C / C ++, mais plutôt avec Fortran. J'ai eu un problème similaire dans certaines bibliothèques standard que IO n'étaient pas inclus dans la bibliothèque que je crée. En fin de compte je les inclus tous et compilé en utilisant le compilateur Fortran. Je n'ai pas utilisé l'un des utilitaires du compilateur R, juste compilé comme si je compilaient une bibliothèque Fortran statique normalement pour une utilisation avec quoi que ce soit d'autre. Cela a bien fonctionné.

Un chemin de débogage pourrait être de compiler une bibliothèque statique à l'aide gcc (ou tout ce que vous utilisez) puis essayez d'inclure et d'appeler cette bibliothèque statique d'un autre programme C, puis si cela fonctionne essayer avec R.

Espérons que cela est utile, l'écriture de ces packages R est assez difficile à moins que vous utilisez C ou Fortran vanille, autant que je peux dire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top