Resumen completo: Golang llama a C / C ++, tutorial de ejemplo

La mayoría de las personas aprenden o usan algo y les gusta ver los resultados de manera intuitiva, solo entonces estarán interesados ​​en continuar.

Si desea mejorar sus habilidades de programación pero no sabe por dónde empezar, y no hay una dirección ni un camino de aprendizaje, únase a nosotros y aprendamos juntos.

Desarrollo de servidor Linux C / C ++ / arquitecto de back-end [Zero Sound Academy] -Tutorial en video de aprendizaje-Clase Tencent ke.qq.com

Prefacio:

Hay muchos tutoriales sobre Golang llamando a C / C ++ en Internet Por lo que he visto hasta ahora, mi opinión personal es bastante confusa y hay muchas trampas. Espero que este artículo se pueda aclarar hasta cierto punto.

Golang se abrevia como ve a continuación, como siempre, no hay tonterías, comenzaremos ahora.


Los métodos de implementación para llamar a funciones c / c ++ en go son:

  • Úselo directamente 嵌套en el archivo go, el más simple e intuitivo
  • El 动态库 .so 或 dllformulario de importación es el más seguro pero muy incómodo y lento.
  • Cite directamente el formato de archivos c / c ++, con niveles claros, fáciles de modificar en cualquier momento para ver los resultados

El tercero 直接引用 c/c++ 文件的形式es el punto principal que quiero presentar.

Se requiere apoyo ambiental

  • Linux tiene gcc y g ++
  • Windows necesita instalar mingw , de lo contrario, habrá tales errores al compilar:cannot find -lmingwex
  • Referencia de Mac Linux

1, anidado directamente en el archivo go

package main
/*
// C 标志io头文件,你也可以使用里面提供的函数
#include <stdio.h> 

void pri(){
	printf("hey");
}

int add(int a,int b){
	return a+b;
}
*/
import "C"  // 切勿换行再写这个

import "fmt"

func main() {
	fmt.Println(C.add(2, 1))
}
复制代码

El código anterior, cópielo y ejecútelo directamente generará el resultado: 3

En conclusión:

  • Siempre que desee hacer referencia relacionada con el contenido de c / c ++, el archivo se escribe en la cabecera, vaya 注释adentro
  • El código c / c ++ anidado debe ajustarse a su sintaxis, no igual que go
  • import "C" Esta oración debe seguirse inmediatamente, después del comentario, no ajustar, de lo contrario se informará un error
  • El formato para llamar a c / c ++ en código go es :, C.xxx()por ejemplo C.add (2, 1)

2. Importe la biblioteca dinámica .so o .dll

Suponga que el directorio del proyecto es el siguiente

|-project
|  |-lib
|  |  |-libvideo.dll
|  |  |-libvideo.so
|  |-include
|  |  |-video.h
|  |-src
|  |  |-main.go
复制代码

El encabezado file.h es el siguiente

//video.h
#ifndef VIDEO_H
#define VIDEO_H
void exeFFmpegCmd(char* cmd); // 声明
#endif
复制代码

El archivo fuente.c es el siguiente

#include <stdio.h>
#include "video.h"

void exeFFmpegCmd(char* cmd){ // 实现
    // ....
    printf("finish");
}
复制代码

Use gcc o g ++ para generar la biblioteca .so, o genere dll en win

P.ej: gcc video.c -fPIC -shared -o libvideo.so

Finalmente main.go

Coloque la biblioteca dinámica en un directorio que le guste, o en el proyecto actual, como en los ejemplos enumerados anteriormente. Requote

package main

/*
#cgo CFLAGS: -Iinclude
#cgo LDFLAGS: -Llib -llibvideo
#include "video.h"
*/
import "C"

import "fmt"

func main() {
   cmd := C.CString("ffmpeg -i ./xxx/*.png ./xxx/yyy.mp4")
   C.exeFFmpegCmd(&cmd)
}
复制代码

Primera respuesta, ¿por qué es lo más seguro e incómodo? Las razones son las siguientes:

  • La biblioteca dinámica es muy difícil de descifrar. Si su código go se filtra, la biblioteca dinámica central no se verá comprometida fácilmente.
  • La biblioteca dinámica se cargará cuando se use, lo que afectará la velocidad
  • La dificultad de operación es mucho más problemática que el método uno

En conclusión

  • CFLAGS: -I路径 Esta oración indica la ruta del archivo de encabezado, -Iinclude indica la carpeta de inclusión del directorio raíz del proyecto actual
  • LDFLAGS: -L路径 -l名字 Especifique la ruta de la biblioteca dinámica, -Llib -llibvideo, especifique debajo de la biblioteca y su nombre video
  • Si la biblioteca dinámica no existe, se explotará 找不到定义之类un mensaje de error

3. La forma de hacer referencia directa a archivos c / c ++ (重点)

Suponga que el directorio del proyecto es el siguiente

|-util
|  |-util.h
|  |-util.c
|  |-util.go
复制代码

util.h

int sum(int a,int b);
复制代码

util.c

#include "util.h"
int sum(int a,int b){
    return (a+b);
}
复制代码

util.go

package util

/*
#include "util.c"
*/
import "C"

import "fmt"

func GoSum(a,b int) {
    s := C.sum(C.int(a),C.int(b))
    fmt.Println(s)
}
复制代码

Llame a main.go así

package main

func main(){
    util.GoSum(4,5)
}
复制代码

Esta es la tercera forma 简洁明了.

Finalmente, agregue, es necesario ir a llamar a c / c ++ general, principalmente utilizando algunas bibliotecas de código abierto conocidas, como ffmpeg, opencvy otro código fuente similar se basa en el lenguaje c / c ++, además de un punto muy importante, que ¡Es la velocidad de carrera!


Autor: Lin Guanhong _ yemas de los dedos debajo del
enlace del espectro : https: //juejin.im/post/6844903553132134414
 

Supongo que te gusta

Origin blog.csdn.net/linuxguitu/article/details/109291875
Recomendado
Clasificación