Pergunta

Eu estou escrevendo uma aplicação gráfica usando Objective-C para o front-end e C ++ para os gráficos de processamento e comunicação de rede. Eu li em torno no site da Apple em busca de uma forma de ligação ou um .dylib ou .so com o meu código C ++ em-lo para o meu projeto de Xcode, mas nada parecia funcionar. Eu era capaz de obter o projeto para referenciá-lo e ligar contra ela, mas quando tentei funções de chamada a partir desse .dylib, ele estava dizendo que ele não sabia o que eu estava tentando fazer. Alguém sabe o que está acontecendo aqui?

Eu sei que Objective-C tem todas as bibliotecas que eu precisaria para fazer gráficos e redes, mas eu me sinto como fazê-lo assim. Eu não tenho feito muito C ++ em um tempo e quero aprender mais Objective-C, de modo que melhor maneira do que para usá-los juntos?

Obrigado, Robbie

Foi útil?

Solução

Você vai bater um obstáculo na forma do que é chamado "nome deturpação". lojas C ++ funcionar nomes de forma não compatível com Obj-C.

Objective-C não implementa as classes da mesma forma como C ++, para que ele não vai gostar.

Uma maneira de contornar isso é para implementar um conjunto de funções simples C que chamam as funções de C ++. Vai ser um bom desafio para manter o número de funções C o mais baixo possível! Você vai acabar com uma interface compacta bom! :)

Para declarar essas funções em um arquivo C ++, você precisa marcá-los como C com:

extern "C" int function_name(char *blob,int number, double foo) {...}

Isso desativa o nome-mangling padrão.

Criar um arquivo de cabeçalho com os protótipos para todas essas funções que você pode compartilhar com o seu código C objectivo.

Você não vai ser capaz de passar as classes em torno da mesma forma (porque seu código ObjC não pode usá-los), mas você vai ser capaz de passar ponteiros (embora você pode ter que mentir sobre os tipos um pouco ).

Outras dicas

A maioria dos projetos em que trabalho têm um frontend ObjC e C ++ backend. Se você está lidando exclusivamente com funções, em seguida, corrigir o nome mangle de Dave Gamble está correto, mas se você está lidando com situações mais complexas, em que você precisa para lidar com ambos os objetos ObjC e C ++, sua melhor aposta é para embrulhar o C ++ objetos em ObjC objetos. Usando referências opacas (que é uma maneira muito elegante de dizer void*), você pode realmente mão ao redor de objetos C ++ em ObjC e vice-versa. Eu tenho algumas código de exemplo que pode ser útil.

Dito isto, para gráficos que você provavelmente vai ter uma performance sério hit fazendo personalizada C ++ em vez de usar Núcleo de Imagem e os quadros relacionados. estruturas Core Image e os outros gráficos são altamente otimizado para o Mac, e você é muito improvável que fazer melhor com enrolado à mão C ++ (ou mesmo muito bem escrito C ++ que não é especificamente para o Mac). Como você se move para 10,6 e expedição central grande, a diferença de desempenho vai ser ainda mais notável porque você vai perder todos os avanços paralelização que você obter gratuitamente o contrário. Isto não tem nada a ver com ObjC; Core Image é C. Você pode chamá-lo de C ++ tudo que você gosta. Eu só recomendo contra gráficos personalizados processando no Mac em qualquer idioma, a menos que você precisa portabilidade ou você tem a experiência necessária para vencer Núcleo de imagem.

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