参考资料 https://blog.csdn.net/qq_30549833/article/details/86157744
vs2013+go1.13+x86 dll文件
go_dll.exe
vs2013:
重新生成解决方案
\cpp_dll\Debug\cpp_dll.dll
goland:
Mac:
CGO_ENABLED=1 GOOS=windows GOARCH=386 go build main.go
Windows:
SET CGO_ENABLED=1
SET GOOS=windows
SET GOARCH=386
go build main.go
// 三种调用方式
res1 := GoCallDll1(4, 5)
fmt.Println("r1:", (int)(res1))
res2 := GoCallDll2(3, 6)
fmt.Println("r2:", Common(res2))
res3 := GoCallDll3(2, 7)
fmt.Println("r3:", (int)(res3))
.a .h .dll .lib 文件生成
go build -buildmode=c-archive go_lib.go
gcc go_lib.def go_lib.a -shared -lwinmm -lWs2_32 -o go_lib.dll -Wl,--out-implib,go_lib.lib
fmt.Println("go call goDLL")
GoCallDll(3, 5)
func GoCallDll(a, b int) uintptr {
DllTestDef := syscall.MustLoadDLL(goDLL)
add := DllTestDef.MustFindProc("Add")
fmt.Println("+++++++MustFindProc:", add, "+++++++")
ret, _, err := add.Call(IntPtr(a), IntPtr(b))
if err != nil && IsFinishError(err) {
fmt.Println(goDLL+fmt.Sprintf(":%d+%d", a, b)+"结果为:", ret)
} else {
fmt.Println(fmt.Sprintf("%+v", err))
}
return ret
}