Llamada mutua entre GO y C (1)

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 

 

Supongo que te gusta

Origin blog.csdn.net/yaojiawan/article/details/108991989
Recomendado
Clasificación