Pergunta

Estou criando um pacote que vai ser utilizado por R (o programa estatístico), eu não sou um especialista usando esta aplicação, mas eu consegui criar um pacote muito simples, usando a seguinte lógica, eu tenho algumas classes em C ++, como o código tem de ser compilado usando o compilador R e só permite que o código C, eu tenho um código de invólucro C que chamar os métodos C ++, e mais tarde eu tenho um script R que chamar os métodos expostos pelo C código, então basicamente é uma comunicação como R <-> C <->. C ++

O tutorial completo que eu usei para criar este pacote é encontrado aqui , eu adicioná-lo como uma referência.

Agora o meu problema é que eu preciso adicionar algumas funcionalidades ao pacote que eu já criado, o que eu preciso fazer é adicionar código para a ligação tardia para um objeto COM que é outro produto que eu criei e que é registrado usando regasm ferramenta.

Este é o código C ++ que eu estou usando para tentar vincular tarde para o objeto COM, eu estou tentando usar IDispatch para fazê-lo:

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

Eu não colar todo o código porque só com estas linhas o compilador está me dando já incomoda, o comando que eu uso para compilação é

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

Onde "Cclass.cc" tem o código C que chamar os métodos C ++ e "C ++ class.cc" é na verdade o código C ++.

Quando eu compilar essas classes o compilador diz

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

I "m certeza de que eu ter adicionado todos os arquivos de cabeçalho que eu preciso, é por isso que eu acredito que o meu problema é que eu não estou incluindo Ole32.lib e Oleaut32.lib que são bibliotecas estáticas.

Então, minha pergunta é: como posso incluir este bibliotecas, a fim de ser capaz de usar os métodos de ligação tardia, como CLSIDFromProgID (...) ou QueryInterface (...). Também se alguém acredita que o meu problema não está ligando este bibliotecas, mas outra coisa, seria ótimo se pode apontar-me a que o meu problema pode ser.

Também tem em mente que eu preciso para ligação com essas estática bibliotecas de uma forma que eles podem ser compilado sem problema pelo compilador R, que se não estou errado é uma mera c compilador.

Foi útil?

Solução

Eu não tentei fazer isso com C / C ++, mas sim com Fortran. Eu tive um problema semelhante em que algumas bibliotecas IO padrão não estavam a ser incluído na biblioteca que foi criado. No final eu só incluiu todos eles e compilado usando o compilador Fortran. Eu não uso qualquer um dos utilitários do compilador R, apenas compilados como se eu estivesse compilar uma biblioteca Fortran estática normalmente para uso com qualquer outra coisa. Isso funcionou bem.

Um caminho de depuração pode ser para compilar como uma biblioteca estática usando gcc (ou o que você está usando), em seguida, tentar incluir e chamada que biblioteca estática de outro programa C, em seguida, se isso funciona tentar com R.

Hope isso é útil, escrevendo estes pacotes R é muito difícil, a menos que você está usando baunilha C ou Fortran, tanto quanto eu posso dizer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top