1.配置WindowsGCC環(huán)境
1.1下載mingw

image.png
- 下載地址Releases · niXman/mingw-builds-binaries (github.com)
- i686(32位),x86_64(64位)
- msvcrt(所有Windows上都可用) ,ucrt(更適合新版windows);除非您的目標(biāo)是舊版本的Windows,否則UCRT作為運行庫是更好的選擇,因為它的編寫是為了更好地支持最新的Windows版本,并提供更好的標(biāo)準(zhǔn)一致性(將您的代碼升級到通用 CRT |Microsoft學(xué)習(xí)
) - POSIX:啟用 C++11/C11 多線程功能。使libgcc依賴于libwinpthreads,因此即使你不直接調(diào)用pthreads API,你也會分發(fā)winpthreads DLL。隨應(yīng)用程序再分發(fā)一個 DLL 并沒有錯。
- win32:無 C++11 多線程功能。
我這里選擇i686-13.1.0-release-posix-dwarf-ucrt-rt_v11-rev1.7z和x86_64-13.1.0-release-posix-seh-ucrt-rt_v11-rev1.7z,面向win10操作系統(tǒng),并且需要std::thread
1.2將mingw添加到環(huán)境變量

image.png
- 需要哪個系統(tǒng)位數(shù)版本,就解壓對應(yīng)版本,并且將對應(yīng)目錄添加到添加系統(tǒng)變量即可
1.3 驗證環(huán)境

image.png
- 在命令行輸入
gcc -v即可
2.創(chuàng)建一個golang項目編譯鏈接c資源
2.1 內(nèi)聯(lián)式,直接在golang內(nèi)部嵌入c語言
package main
/*
#include <stdio.h>
void SayHello() {
printf("Hello World from DLL!");
}
*/
import "C"
func main() {
C.SayHello()
}
- 但凡要引用與 c/c++ 相關(guān)的內(nèi)容,寫到 go 文件的頭部注釋里面
- 嵌套的 c/c++ 代碼必須符合其語法,不與 go 一樣
- import "C" 這句話要緊隨,注釋后,不要換行,否則報錯
- go 代碼中調(diào)用 c/c++ 的格式是: C.xxx(),例如 C.SayHello()
2.2導(dǎo)入動態(tài)庫.so 或 .dll 的形式
2.2.1 使用gcc編譯動態(tài)庫
- mylib.c
#include <stdio.h>
void SayHello() {
printf("Hello World from DLL!");
}
- mylib.h
// mylib.h
#ifndef MYLIB_H
#define MYLIB_H
#ifdef __cplusplus
extern "C" {
#endif
void SayHello();
#ifdef __cplusplus
}
#endif
#endif // MYLIB_H
2.2.2編譯成dll
- Windows:
gcc -shared -o mylib.dll mylib.c
- Linux:
gcc -fPIC -shared -o libmylib.so mylib.c
2.2.3 驗證編譯后dll
- test.c
#include <stdio.h>
#include "mylib.h"
int main() {
SayHello();
return 0;
}
gcc test.c mylib.dll -o test.exe-
.\test.exe
打印Hello World from DLL!說明dll可用
2.2.4 golang導(dǎo)入dll
package main
/*
#cgo windows LDFLAGS: -L. -lmylib
#cgo linux LDFLAGS: -L. -lmylib
#include "mylib.h"
*/
import "C"
func main() {
C.SayHello()
}
- 復(fù)制
mylib.dll和mylib.h到golang項目根目錄,即可運行
2.3 外聯(lián)式,鏈接C源文件,而不需要預(yù)先編譯為庫文件
package main
/*
#cgo CFLAGS: -I./mylib
#include "mylib.c"
*/
import "C"
func main() {
C.SayHello()
}
-
-I./mylib指明源文件所在目錄