包括的な要約:GolangはC / C ++を呼び出し、チュートリアルの例

ほとんどの人は何かを学んだり使用したりしており、結果を直感的に確認したいので、継続することに興味があります。

プログラミングスキルを向上させたいが、どこから始めればよいかわからず、学習の方向性や道筋がない場合は、ぜひご参加ください。

C / C ++ Linuxサーバー開発/バックエンドアーキテクト[ゼロサウンドアカデミー]-ラーニングビデオチュートリアル-テンセントクラスke.qq.com

序文:

インターネット上でC / C ++を呼び出すGolangに関するチュートリアルはたくさんありますが、これまで見てきた限り、私の個人的な意見はかなり乱雑で、多くの落とし穴があります。この記事がある程度明確になることを願っています。

Golangは、以下のように省略されます。いつものように、ナンセンスではありません。ここから始めます。


goでc / c ++関数を呼び出す実装方法は次のとおりです。

  • 嵌套最もシンプルで直感的なgoファイルで直接使用する
  • インポート动态库 .so 或 dllフォームは最も安全ですが、非常に不快で時間がかかります
  • 明確なレベルでc / c ++ファイルの形式を直接引用し、いつでも簡単に変更して結果を確認できます

三つ目直接引用 c/c++ 文件的形式は、私が紹介したい要点です。

環境サポートが必要

  • Linuxにはgccとg ++があります
  • Windowsはmingwをインストールする必要があります。そうしないと、コンパイル時にそのようなエラーが発生します。cannot find -lmingwex
  • MacリファレンスLinux

1、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))
}
复制代码

上記のコードを直接コピーして実行すると、結果が出力されます。3

結論として:

  • あなたは、C / C ++コンテンツに関連する参照したいときはいつでも、ファイルは、ヘッド行くに書き込まれている注释内部
  • ネストされたc / c ++コードは、goと同じではなく、その構文に準拠している必要があります
  • import "C" コメントの直後にこの文を続ける必要があります。折り返さないでください。折り返さないと、エラーが報告されます。
  • goコードでc / c ++を呼び出す形式は、C.xxx()次のとおりです。たとえば、C.add(2、1)

2.動的ライブラリ.soまたは.dllをインポートします

プロジェクトディレクトリが次のようになっているとします。

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

ヘッダーfile.hは次のとおりです

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

ソースfile.cは次のとおりです

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

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

gccまたはg ++を使用して.soライブラリを生成するか、winの下でdllを生成します

例えば: gcc video.c -fPIC -shared -o libvideo.so

最後にmain.go

上記の例のように、動的ライブラリを好きなディレクトリまたは現在のプロジェクトに配置します。再引用

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)
}
复制代码

これが最も安全で最も不快な理由を最初に答えてください。その理由は次のとおりです。

  • 動的ライブラリを解読するのは非常に困難です。goコードがリークした場合でも、コア動的ライブラリが簡単に侵害されることはありません。
  • 動的ライブラリは使用時に読み込まれ、速度に影響します
  • 操作の難しさは方法1よりもはるかに厄介です

結論として

  • CFLAGS: -I路径 この文はヘッダーファイルのパスを示し、-Iincludeは現在のプロジェクトルートディレクトリのインクルードフォルダを示します
  • LDFLAGS: -L路径 -l名字 動的ライブラリのパス-Llib-llibvideoを指定し、libとその名前の下にvideoを指定します
  • 動的ライブラリが存在しない場合、找不到定义之类エラーメッセージが展開されます

3. c / c ++ファイルを直接参照する形式 (重点)

プロジェクトディレクトリが次のようになっているとします。

|-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)
}
复制代码

このようにmain.goを呼び出します

package main

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

これは3番目の方法简洁明了です。

最後に、主のようないくつかのよく知られているオープンソースのライブラリを使用して、++一般的なC / Cを呼び出すために行く必要性を追加しffmpegopencvおよび他のそのようなソースコードは、彼らは、非常に重要なポイントに加えて、C / C ++言語に基づいています走行速度です!


著者:Lin Guanhong _スペクター
リンクの下の指先:https://juejin.im/post/6844903553132134414
 

おすすめ

転載: blog.csdn.net/linuxguitu/article/details/109291875