La plupart des gens apprennent ou utilisent quelque chose et aiment voir les résultats intuitivement, seront-ils intéressés à continuer.
Si vous souhaitez améliorer vos compétences en programmation mais que vous ne savez pas par où commencer, et qu'il n'y a pas de direction et de chemin d'apprentissage, rejoignez-nous et apprenez ensemble.
Avant-propos:
Il existe de nombreux tutoriels sur Golang appelant C / C ++ sur Internet. Pour autant que je l'ai vu jusqu'à présent, mon opinion personnelle est plutôt confuse et il y a de nombreux pièges. J'espère que cet article pourra être rendu plus clair dans une certaine mesure.
Golang est abrégé comme ci-dessous, comme toujours, pas de bêtises, nous allons commencer maintenant.
Les méthodes d'implémentation pour appeler les fonctions c / c ++ dans go sont:
- Utilisez directement
嵌套
dans le fichier go, le plus simple et intuitif - Le
动态库 .so 或 dll
formulaire d' importation est le plus sûr mais très inconfortable et plus lent - Citez directement la forme de fichiers c / c ++, avec des niveaux clairs, faciles à modifier à tout moment pour voir les résultats
Le troisième 直接引用 c/c++ 文件的形式
est le point principal que je veux introduire.
Support environnemental requis
- Linux a gcc et g ++
- Windows doit installer mingw , sinon il y aura de telles erreurs lors de la compilation:
cannot find -lmingwex
- Référence Mac Linux
1, directement imbriqué dans le fichier 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))
}
复制代码
Le code ci-dessus, copiez et exécutez directement le résultat: 3
en conclusion:
- Chaque fois que vous souhaitez faire référence au contenu c / c ++, le fichier est écrit dans la tête, allez à l'
注释
intérieur - Le code c / c ++ imbriqué doit se conformer à sa syntaxe, pas la même chose que go
import "C"
Cette phrase doit être suivie immédiatement, après le commentaire, ne pas envelopper, sinon une erreur sera signalée- Le format de l'appel c / c ++ dans le code go est :,
C.xxx()
par exemple C.add (2, 1)
2. Importez la bibliothèque dynamique .so ou .dll
Supposons que le répertoire du projet soit le suivant
|-project
| |-lib
| | |-libvideo.dll
| | |-libvideo.so
| |-include
| | |-video.h
| |-src
| | |-main.go
复制代码
Le fichier d'en-tête.h est le suivant
//video.h
#ifndef VIDEO_H
#define VIDEO_H
void exeFFmpegCmd(char* cmd); // 声明
#endif
复制代码
Le fichier source.c est le suivant
#include <stdio.h>
#include "video.h"
void exeFFmpegCmd(char* cmd){ // 实现
// ....
printf("finish");
}
复制代码
Utilisez gcc ou g ++ pour générer la bibliothèque .so, ou générez des dll sous win
Par exemple: gcc video.c -fPIC -shared -o libvideo.so
Enfin main.go
Placez la bibliothèque dynamique dans un répertoire que vous aimez, ou dans le projet en cours, tout comme les exemples listés ci-dessus. Demander
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)
}
复制代码
Première réponse: pourquoi est-ce le plus sûr et le plus inconfortable? Les raisons sont les suivantes:
- Il est très difficile de casser la bibliothèque dynamique. Si votre code go fuit, la bibliothèque dynamique principale ne sera pas facilement compromise.
- La bibliothèque dynamique sera chargée lors de son utilisation, affectant la vitesse
- La difficulté de fonctionnement est beaucoup plus gênante que la première méthode
en conclusion
CFLAGS: -I路径
Cette phrase indique le chemin du fichier d'en-tête, -Iinclude indique le dossier d'inclusion du répertoire racine du projet courantLDFLAGS: -L路径 -l名字
Précisez le chemin de la librairie dynamique, -Llib -llibvideo, spécifiez sous la lib et son nom video- Si la bibliothèque dynamique n'existe pas,
找不到定义之类
un message d'erreur sera éclaté
3. La forme de référencement direct des fichiers c / c ++ (重点)
Supposons que le répertoire du projet soit le suivant
|-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)
}
复制代码
Appelez main.go comme ça
package main
func main(){
util.GoSum(4,5)
}
复制代码
C'est la troisième voie 简洁明了
.
Enfin, ajoutez, il faut aller appeler le c / c ++ général, principalement en utilisant certaines bibliothèques open source bien connues, telles que ffmpeg
, opencv
et d'autres codes source de ce type sont basés sur le langage c / c ++, en plus d'un point très important, ils Est la vitesse de course!
Auteur: Lin Guanhong _ bouts des doigts sous le
lien du spectre : https: //juejin.im/post/6844903553132134414