Résumé complet: Golang appelle C / C ++, exemple de tutoriel

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.

Développement de serveurs Linux C / C ++ / architecte back-end [Zero Sound Academy] - Tutoriel vidéo d'apprentissage - Classe Tencent ke.qq.com

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 或 dllformulaire 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 courant
  • LDFLAGS: -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, opencvet 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
 

Je suppose que tu aimes

Origine blog.csdn.net/linuxguitu/article/details/109291875
conseillé
Classement