A Mistura De Bibliotecas C/C++
-
09-06-2019 - |
Pergunta
É possível que o gcc para ligar uma biblioteca que foi criado com o Visual C++?Se afirmativo, há conflitos/problemas que possam surgir a partir de fazê-lo?
Solução
Alguns dos comentários aqui as respostas são um pouco demasiado generalistic.
Enquanto não, no caso específico mencionado gcc binários não vínculo com VC++ library (AFAIK).O real meios de articulação código/bibliotecas é uma questão da ABI padrão a ser utilizado.
Cada vez mais comum no mundo incorporado é o EABI (ou BRAÇO ABI) padrão (baseado no trabalho feito durante Itanium desenvolvimento http://www.codesourcery.com/cxx-abi/).Se os compiladores EABI compatível com o que eles podem produzir arquivos executáveis e bibliotecas que vai trabalhar uns com os outros.Um exemplo de várias ferramentas de trabalho em conjunto é o BRAÇO do RVCT compilador que produz binários que vai trabalhar com o GCC BRAÇO ABI binários.
(O código sourcery link está desativado no momento, mas pode ser em cache do google)
Outras dicas
Eu acho que não.Geralmente c++ compiladores têm bastante diferentes métodos de nome-desconfiguração o que significa que o vinculadores não vai conseguir localizar os símbolos corretos.Isso é uma coisa boa, pelo caminho, porque compiladores de C++ são permitidos pela norma ter muito maiores níveis de incompatibilidade que apenas este que fará com que o programa falha, morrer, comer cachorros e mancha de tinta nas paredes.
De costume esquemas para contornar este geralmente envolvem independente de linguagem de técnicas como COM ou CORBA.Um simples santificados método é usar C "wrappers" em torno de seu código C++.
Não é possível.Geralmente não é possível para bibliotecas de ligação produzidos por diferentes versões do mesmo compilador.
Não.Puro e simples :-)
Sim, se você fizer uma ligação dinâmica e tornar a interface c-estilo.lib.exe vai gerar bibliotecas de importação que são compatíveis com o gcc toolchain.
Que vai resolver seus problemas de vinculação.No entanto, que é apenas o início do problema.
Seus problemas maiores serão as coisas como exceções, e a alocação de memória.
- Você deve garantir que nenhuma exceção cruz do VC++ para o gcc código, não há nenhuma garantia de compatibilidade.
- Cada objeto do VC++ library vai precisar para viver em pilha, porque:
- Não misture gcc novo/eliminar com qualquer coisa de VC++, coisas ruins vão acontecer.Isto vai para a construção do objeto na pilha.No entanto, se você fizer uma interface como create_some_obj()/delete_some_obj() você acaba não usando o gcc novo para a construção de VC++ objetos.Talvez fazer um pequeno processador de objeto que manipula a construção e a destruição.Desta forma, preserva-RAII, mas ainda uso o c-interface para a verdadeira interface.
- Convenção de chamada deve ser correta.No VC++ há cdecl e stdcall.Se o gcc tentei chamar uma função importado com o errado chamar tipo, coisas ruins vão acontecer.
A linha inferior é manter uma interface simples que é compatível com ANSI C, e você deve ser fino.O fato de que o louco C++ passa por trás está tudo bem, contanto que ele está contido.
Ah, e certifique-se de que todo o código é reentrante, ou você corre o risco de abrir um todo noether, pode-o-vermes.