Enamorarse de Golang, C / C ++ no quiere darse por vencido. Afortunadamente, el lenguaje Go proporciona un mecanismo para llamarse entre sí con el lenguaje C (CGO). Incluya las siguientes preguntas
- C / C ++ llama a bibliotecas escritas en programas Go.
- Go language llama a bibliotecas dinámicas y estáticas C / C ++.
- Go language llama programa de devolución de llamada en lenguaje C (Callback)
- Pasar parámetros entre funciones
Este artículo analiza primero los dos primeros temas.
Go y C ++ se llaman entre sí es algo muy significativo. El lenguaje Go es mucho más eficiente que C / C ++ al escribir programas de red, servicios en la nube y otros programas. Solo se necesitan unas pocas líneas para escribir un servidor web en Go. C ++ es más conveniente cuando se trata de interfaces de bajo nivel.
C / C ++ llamar a Go
Primero escribe un programa go
package main
import "C"
import (
"fmt"
)
//export Foo
func Foo(a, b int) int {
return a + b;
}
//export Bar
func Bar() {
fmt.Println("Say Hello From Go")
}
func main() {}
Nota: El comentario // exportar Foo y // exportar barra significa exportar dos funciones
Compilar
go build -o golib.so -buildmode=c-shared *.go
Se generan dos archivos en el directorio:
golib.h
golib.so
Programa principal en lenguaje C
#include "golib.h"
#include <stdio.h>
int main() {
printf("%lld\n",Foo(1,2));
Bar();
return 0;
}
Compilar
gcc callgo.c -o callgo ./golib.so
Ir llamadas C / C ++
Código de biblioteca de lenguaje C (hello.c)
#include <stdio.h>
void hello(int i) {
printf("Hello C: %d\n", i);
}
Hola h
void hello(int);
Ir a la biblioteca dinámica de llamadas C
Compilar biblioteca dinámica
gcc -fPIC -shared -o libhello.so hello.c
Cree un directorio de biblioteca mylib y copie libhello.so en el directorio mylib. Y generar la ruta de la ruta:
export LD_LIBRARY_PATH=./mylib
ir código
package main
// #cgo CFLAGS: -I./mylib
// #cgo LDFLAGS: -L./mylib -lhello
// #include "hello.h"
import "C"
import "fmt"
func main() {
C.hello(C.int(12))
fmt.Println("Hello Go");
}
ir a la compilación del programa
go build CallC.go
Ir a la biblioteca estática de llamadas C
Primero compile y construya la biblioteca estática c
gcc -Wall -c hello.c
ar -rv libhello.a hello.o
Copie libhello.a al destino mylib.
Aquí hay un problema: muchos artículos en Internet dicen que los programas GO y las conexiones dinámicas son lo mismo, pero no es así. El programa go debería ser:
package main
// #cgo CFLAGS: -I./mylib
// #cgo LDFLAGS: ./mylib/libhello.a
// #include "hello.h"
import "C"
import "fmt"
func main() {
C.hello(C.int(12))
fmt.Println("Hello Go");
}
Establezca cgo LDFLAGS como el nombre de archivo estático // #cgo LDFLAGS: ./mylib/libhello.a
Y el comando de compilación es el mismo
go build CallC.go