Pregunta

Estoy creando un paquete que va a ser utilizado por R (el programa estadístico), no soy un experto en el uso de esta aplicación, pero he logrado crear un paquete muy simple, utilizando la siguiente lógica, no tengo algunas clases en C ++, ya que el código tiene que ser compilado con el compilador R y sólo permite que el código C, tengo un código de contenedor C que llama a los métodos de C ++, y más tarde tengo un script de R que llamar a los métodos expuestos por el C código, así que básicamente es una comunicación como R <-> C <->. C ++

El tutorial completo que he utilizado para crear este paquete se encuentra aquí , lo añado como referencia.

Ahora mi problema es que tengo que añadir algunas funciones al paquete que ya creado, lo que tengo que hacer es añadir código para el enlace en tiempo a un objeto COM, que es otro producto que he creado y que se ha registrado el uso regasm herramienta.

Este es el código C ++ que estoy usando para tratar de finales se unen al objeto COM, estoy tratando de utilizar IDispatch para hacerlo:

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

Yo no pegar el código entero porque sólo con estas líneas el compilador está dando me preocupa ya, el comando que utilizo para compilar es

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

Donde "Cclass.cc" tiene el código C que llaman a la c ++ métodos y "C ++ class.cc" es en realidad el código C ++.

Cuando compilo estas clases el compilador dice

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

I "m seguro de que he añadido todos los archivos de cabecera que necesito, por eso creo que mi problema es que no estoy incluyendo Ole32.lib y Oleaut32.lib que son bibliotecas estáticas.

Por lo tanto, mi pregunta es, ¿cómo puedo incluir esta bibliotecas con el fin de poder utilizar los métodos para el enlace en tiempo, como CLSIDFromProgID (...) o QueryInterface (...). Además, si alguien cree que mi problema no es la vinculación de esta bibliotecas, sino otra cosa, sería grande si me puede apuntar a la que mi problema puede ser.

También tenga en cuenta que necesito para enlazar con las bibliotecas estáticas de manera que se pueden compilar sin problemas por el compilador R, que si no me equivoco es un mero compilador C.

¿Fue útil?

Solución

No he intentado hacer esto con C / C ++, sino más bien con Fortran. He tenido un problema similar en el que algunas librerías estándar IO no estaban siendo incluidos en la biblioteca fui creado. Al final acabo todos ellos incluidos y compilado con el compilador Fortran. Yo no usar cualquiera de las utilidades R compilador, simplemente compilados como si estuviera compilando una biblioteca estática Fortran normalmente para su uso con cualquier otra cosa. Esto funcionó bien.

Un camino de depuración podría ser para compilar como una biblioteca estática se utiliza gcc (o lo que sea que estés usando) y luego tratar de incluir y llamar a esa biblioteca estática de otro programa en C, entonces si que funciona pruebe con R.

Espero que esto es útil, escribiendo estos paquetes R es bastante difícil a menos que esté usando la vainilla C o Fortran por lo que yo puedo decir.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top