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.
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 或 dll
formulario 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 actualLDFLAGS: -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
, opencv
y 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