做者:林冠宏 / 指尖下的幽靈c++
掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8git
博客:http://www.cnblogs.com/linguanh/github
GitHub : https://github.com/af913337456/golang
Golang 調用 C/C++ 的教程網上不少,就我目前所看到的,我的看法就是比較亂,坑也不少。但願本文能在必定程度上,作到更通俗明瞭。安全
嵌套
在go文件中使用,最簡單直觀的動態庫 .so 或 dll
的形式,最安全可是很不爽也比較慢的第三個直接引用 c/c++ 文件的形式
是我要介紹的重點。ide
cannot find -lmingwex
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函數
註釋
裏面import "C"
這句話要緊隨,註釋後,不要換行,不然報錯C.xxx()
,例如 C.add(2, 1)|-project
| |-lib
| | |-libvideo.dll
| | |-libvideo.so
| |-include
| | |-video.h
| |-src
| | |-main.go
複製代碼
//video.h
#ifndef VIDEO_H
#define VIDEO_H
void exeFFmpegCmd(char* cmd); // 聲明
#endif
複製代碼
#include <stdio.h>
#include "video.h"
void exeFFmpegCmd(char* cmd){ // 實現
// ....
printf("finish");
}
複製代碼
例如: gcc video.c -fPIC -shared -o libvideo.so
學習
把動態庫放到一個你喜歡的目錄,也能夠放到當前項目裏面,像上面列出的例子同樣。再引用ui
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)
}
複製代碼
CFLAGS: -I路徑
這句話指明頭文件所在路徑,-Iinclude 指明 當前項目根目錄的 include 文件夾LDFLAGS: -L路徑 -l名字
指明動態庫的所在路徑,-Llib -llibvideo,指明在 lib 下面以及它的名字 video找不到定義之類
的錯誤信息(重點)
|-util
| |-util.h
| |-util.c
| |-util.go
複製代碼
int sum(int a,int b);
複製代碼
#include "util.h"
int sum(int a,int b){
return (a+b);
}
複製代碼
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)
}
複製代碼
package main
func main(){
util.GoSum(4,5)
}
複製代碼
第三種方式即是如此簡潔明瞭
。spa
最後,補充一下,通常須要 go 調用 c/c++ 的,主要是使用一些著名的開源庫,例如 ffmpeg
,opencv
,等這些源碼是基於 c/c++ 語言的,除此以外還有一個很重要的點,即是運行速度!