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作為運(yùn)行庫(kù)是更好的選擇,因?yàn)樗木帉懯菫榱烁玫刂С肿钚碌腤indows版本,并提供更好的標(biāo)準(zhǔn)一致性(將您的代碼升級(jí)到通用 CRT |Microsoft學(xué)習(xí)
) - POSIX:?jiǎn)⒂?C++11/C11 多線程功能。使libgcc依賴于libwinpthreads站蝠,因此即使你不直接調(diào)用pthreads API揍魂,你也會(huì)分發(fā)winpthreads DLL。隨應(yīng)用程序再分發(fā)一個(gè) DLL 并沒(méi)有錯(cuò)檩电。
- win32:無(wú) 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
- 需要哪個(gè)系統(tǒng)位數(shù)版本料按,就解壓對(duì)應(yīng)版本,并且將對(duì)應(yīng)目錄添加到添加系統(tǒng)變量即可
1.3 驗(yàn)證環(huán)境
image.png
- 在命令行輸入
gcc -v
即可
2.創(chuàng)建一個(gè)golang項(xiàng)目編譯鏈接c資源
2.1 內(nèi)聯(lián)式卓箫,直接在golang內(nèi)部嵌入c語(yǔ)言
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++ 代碼必須符合其語(yǔ)法,不與 go 一樣
- import "C" 這句話要緊隨烹卒,注釋后闷盔,不要換行,否則報(bào)錯(cuò)
- go 代碼中調(diào)用 c/c++ 的格式是: C.xxx()旅急,例如 C.SayHello()
2.2導(dǎo)入動(dòng)態(tài)庫(kù).so 或 .dll 的形式
2.2.1 使用gcc編譯動(dòng)態(tài)庫(kù)
- 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 驗(yàn)證編譯后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!
說(shuō)明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項(xiàng)目根目錄逢勾,即可運(yùn)行
2.3 外聯(lián)式,鏈接C源文件,而不需要預(yù)先編譯為庫(kù)文件
package main
/*
#cgo CFLAGS: -I./mylib
#include "mylib.c"
*/
import "C"
func main() {
C.SayHello()
}
-
-I./mylib
指明源文件所在目錄