Na palestra tecnologia SWIG foi muito brevemente mencionado, algo como "..until temos a gole feito .."
StackedCrooked
1
@ Matt: Provavelmente ele quer usar uma biblioteca C ++ existente sem precisar portá-la para C ou Go. Eu queria a mesma coisa.
Graeme Perrow
Não consigo pensar em uma única biblioteca decente disponível para C ++ e não para C. Eu adoraria saber o que você tem em mente.
Matt Joiner
13
@ Matt: Um exemplo é a biblioteca Boost, e existem milhares de outras bibliotecas C ++ úteis. Mas talvez eu só estou alimentando um troll aqui ...
Frank
@ Matt: no meu caso, eu queria fazer uma interface Go para nossa biblioteca cliente existente, mas a biblioteca é principalmente C ++. Portá-lo para C ou Go simplesmente não é uma opção.
Graeme Perrow
Respostas:
154
Atualizar: Consegui vincular uma pequena classe C ++ de teste ao Go
Se você agrupar seu código C ++ com uma interface C, poderá chamar sua biblioteca com cgo (veja o exemplo de gmp em $GOROOT/misc/cgo/gmp ).
Não tenho certeza se a idéia de uma classe em C ++ é realmente expressável no Go, pois ela não tem herança.
Tenha cuidado com isso, não tenho idéia do que pode acontecer com a memória se você a enviar entre os dois idiomas.
Scott Wales
11
Eu tenho que dizer, este exemplo me lembra porque eu quero escrever Go puro. Veja como o lado C ++ é maior e mais feio. Ick.
Jeff Allen
@ScottWales alguma chance de você colocar isso em um repositório no Github ou algo assim? Eu adoraria ver um exemplo de trabalho
netpoetica
7
@Arne: Você não diminuiu a resposta porque não é a melhor. Você recusou uma resposta porque não é útil. Enquanto isso funcionar, essa resposta ainda será útil, mesmo que haja soluções melhores.
Graeme Perrow
Boas notícias, o Go irá compilar o cpp agora, para que o makefile não seja mais necessário. Os invólucros inseguros.Pointer não funcionaram para mim. Uma pequena modificação compilada para mim: play.golang.org/p/hKuKV51cRpgo test deve funcionar sem o makefile
Drew
47
Parece que atualmente o SWIG é a melhor solução para isso:
Ele suporta herança e até permite subclassificar a classe C ++ com a estrutura Go, portanto, quando métodos substituídos são chamados no código C ++, o código Go é acionado.
Eu gostaria que houvesse uma maneira de aumentar isso. As outras respostas estão desatualizadas. Além disso SWIG tem versionadas-se swig.org/Doc3.0/Go.html
Os programas Go são vinculados aos programas C / C ++?
Existem duas implementações do compilador Go, gc (o programa 6g e amigos) e gccgo. O Gc usa uma convenção de chamada e vinculador diferentes e, portanto, só pode ser vinculado a programas C usando a mesma convenção. Existe um compilador C, mas nenhum compilador C ++. O Gccgo é um front-end do GCC que pode, com cuidado, ser vinculado a programas C ou C ++ compilados pelo GCC.
O programa cgo fornece o mecanismo para uma "interface de função externa" para permitir a chamada segura de bibliotecas C a partir do código Go. O SWIG estende esse recurso às bibliotecas C ++.
Eu posso executar o programa de exemplo da seguinte maneira:
$ make
clang++-o liblibrary.so library.cpp library-bridge.cpp \
-std=c++17-O3 -Wall-Wextra-fPIC -shared
$ go run library.go
[c++ bridge] LIB_NewFoo(42)[c++]Foo::Foo(42)[c++ bridge] LIB_NewFoo(42) will return pointer 0x42002e0[c++ bridge] LIB_FooValue(0x42002e0)[c++]Foo::value()is42[go]42[c++ bridge] LIB_DestroyFoo(0x42002e0)[c++]Foo::~Foo(42)
Importante
Os comentários acima import "C"no goprograma NÃO SÃO OPCIONAIS . Você deve colocá-los exatamente como mostrado para que cgosaiba qual cabeçalho e biblioteca carregar, neste caso:
Parece que é uma das perguntas mais antigas sobre Golang. E respostas ao mesmo tempo para nunca atualizar. Durante esses três a quatro anos, muitas novas bibliotecas e publicações no blog foram lançadas. Abaixo estão os poucos links que eu achei úteis.
Fala-se de interoperabilidade entre C e Go ao usar o compilador gcc Go, gccgo. Entretanto, existem limitações para a interoperabilidade e o conjunto de recursos implementados do Go ao usar o gccgo (por exemplo, goroutines limitadas, sem coleta de lixo).
1. Crie um idioma sem recursos para gerenciamento manual de memória, 2. Remova a coleta de lixo? Eu sou o único coçando a cabeça com isso?
György Andrasek 11/11/2009
2
Você está andando em território desconhecido aqui. Aqui está o exemplo do Go para chamar o código C, talvez você possa fazer algo assim depois de ler as convenções de manipulação e chamada de nomes C ++ e várias tentativas e erros.
O problema aqui é que uma implementação compatível não precisa colocar suas classes em um arquivo .cpp de compilação. Se o compilador puder otimizar a existência de uma classe, desde que o programa se comporte da mesma maneira sem ela, ele poderá ser omitido do executável de saída.
C tem uma interface binária padronizada. Portanto, você poderá saber que suas funções são exportadas. Mas o C ++ não tem esse padrão por trás disso.
Engraçado quantas edições mais amplas este anúncio foi divulgado. Dan Lyke teve uma discussão muito divertida e atenciosa em seu site, Flutterby, sobre o desenvolvimento de Interprocess Standards como uma maneira de inicializar novas linguagens (e outras ramificações, mas essa é a mais pertinente aqui).
Essencialmente 'Se a importação de "C" for imediatamente precedida por um comentário, esse comentário, chamado de preâmbulo, será usado como cabeçalho ao compilar as partes C do pacote. Por exemplo: '
source: https://golang.org/cmd/cgo/
Respostas:
Atualizar: Consegui vincular uma pequena classe C ++ de teste ao Go
Se você agrupar seu código C ++ com uma interface C, poderá chamar sua biblioteca com cgo (veja o exemplo de gmp em
$GOROOT/misc/cgo/gmp
).Não tenho certeza se a idéia de uma classe em C ++ é realmente expressável no Go, pois ela não tem herança.
Aqui está um exemplo:
Eu tenho uma classe C ++ definida como:
que eu quero usar no Go. Vou usar a interface C
(Eu uso uma
void*
estrutura C em vez de C para que o compilador saiba o tamanho de Foo)A implementação é:
com tudo isso feito, o arquivo Go é:
O makefile que eu usei para compilar isso foi:
Tente testá-lo com:
Você precisará instalar a biblioteca compartilhada com make install e, em seguida, execute make test. A produção esperada é:
fonte
go test
deve funcionar sem o makefileParece que atualmente o SWIG é a melhor solução para isso:
http://www.swig.org/Doc2.0/Go.html
Ele suporta herança e até permite subclassificar a classe C ++ com a estrutura Go, portanto, quando métodos substituídos são chamados no código C ++, o código Go é acionado.
A seção sobre perguntas frequentes sobre C ++ no Go é atualizada e agora menciona SWIG e não diz mais " porque o Go é coletado no lixo, não é aconselhável fazê-lo, pelo menos ingênuo ".
fonte
Ainda não é possível pelo que li nas Perguntas frequentes :
fonte
A partir do go1.2 +, o cgo incorpora e compila automaticamente o código C ++:
http://golang.org/doc/go1.2#cgo_and_cpp
fonte
Eu criei o exemplo a seguir com base na resposta de Scott Wales . Eu testei no macOS High Sierra 10.13.3
go
versão em execuçãogo1.10 darwin/amd64
.(1) Código para
library.hpp
a API C ++ que pretendemos chamar.(2) Código para
library.cpp
a implementação de C ++.(3) Código
library-bridge.h
da ponte necessário para expor umaC
API implementadaC++
para que elago
possa ser usada.(4) Código para
library-bridge.cpp
a implementação da ponte.(5) Finalmente,
library.go
o programa go chamando a API C ++.Usando o seguinte Makefile
Eu posso executar o programa de exemplo da seguinte maneira:
Importante
Os comentários acima
import "C"
nogo
programa NÃO SÃO OPCIONAIS . Você deve colocá-los exatamente como mostrado para quecgo
saiba qual cabeçalho e biblioteca carregar, neste caso:Link para o repositório GitHub com o exemplo completo .
fonte
Parece que é uma das perguntas mais antigas sobre Golang. E respostas ao mesmo tempo para nunca atualizar. Durante esses três a quatro anos, muitas novas bibliotecas e publicações no blog foram lançadas. Abaixo estão os poucos links que eu achei úteis.
SWIG and Go
Chamando código C ++ a partir do SWIG
Na comparação de idiomas, C ++ e Go
GoForCPPProgrammers
fonte
Fala-se de interoperabilidade entre C e Go ao usar o compilador gcc Go, gccgo. Entretanto, existem limitações para a interoperabilidade e o conjunto de recursos implementados do Go ao usar o gccgo (por exemplo, goroutines limitadas, sem coleta de lixo).
fonte
Você está andando em território desconhecido aqui. Aqui está o exemplo do Go para chamar o código C, talvez você possa fazer algo assim depois de ler as convenções de manipulação e chamada de nomes C ++ e várias tentativas e erros.
Se você ainda quiser experimentá-lo, boa sorte.
fonte
O problema aqui é que uma implementação compatível não precisa colocar suas classes em um arquivo .cpp de compilação. Se o compilador puder otimizar a existência de uma classe, desde que o programa se comporte da mesma maneira sem ela, ele poderá ser omitido do executável de saída.
C tem uma interface binária padronizada. Portanto, você poderá saber que suas funções são exportadas. Mas o C ++ não tem esse padrão por trás disso.
fonte
Pode ser necessário adicionar
-lc++
aoLDFlags
Golang / CGo para reconhecer a necessidade da biblioteca padrão.fonte
Engraçado quantas edições mais amplas este anúncio foi divulgado. Dan Lyke teve uma discussão muito divertida e atenciosa em seu site, Flutterby, sobre o desenvolvimento de Interprocess Standards como uma maneira de inicializar novas linguagens (e outras ramificações, mas essa é a mais pertinente aqui).
fonte
Isso pode ser alcançado usando o comando cgo.
Essencialmente 'Se a importação de "C" for imediatamente precedida por um comentário, esse comentário, chamado de preâmbulo, será usado como cabeçalho ao compilar as partes C do pacote. Por exemplo: '
source: https://golang.org/cmd/cgo/
fonte