golang开发windows动态库和linux动态库

编译环境

  • go1.20
  • MingW交叉编译器 mingw-w64 apt install mingw-w64
  • ARM交叉编译器 apt install gcc-aarch64-linux-gnu

Windows编译指令

  • 64位动态库
windows:
	CGO_ENABLED=1 \
	GOOS=windows \
	GOARCH=amd64 \
	CC=x86_64-w64-mingw32-gcc \
	go build \
	-buildmode=c-shared \
	-o build/bin/windows/${OutAppName}.dll
  • 32位动态库
windows-32:
	CGO_ENABLED=1 \
	GOOS=windows \
	GOARCH=386 \
	CC=i686-w64-mingw32-gcc \
	go build \
	-buildmode=c-shared \
	-o build/bin/windows/x86/${OutAppName}.dll

Linux编译指令

  • arm64
linux-arm64:
	CGO_ENABLED=1 \
	GOOS=linux \
	GOARCH=arm64 \
	CC=aarch64-linux-gnu-gcc \
	go build \
	-buildmode=c-shared \
	-o build/bin/linux/arm64/lib${OutAppName}.so
  • amd64
linux-amd64:
	CGO_ENABLED=1 \
	GOOS=linux \
	GOARCH=amd64 \
	go build \
	-buildmode=c-shared \
	" \
	-o build/bin/linux/amd64/lib${OutAppName}.so

导出函数

package main

import "C"
import (
	"fmt"
	"unsafe"
)

// 版本号
//
//	outstr【输出】 返回信息
//	outlen【输出】 返回信息长度
//
//export Version
func Version(outstr *C.char, outlen *C.int) C.int {
	bytOut := []byte(version.Version)
	*outlen = C.int(len(bytOut))
	bytOutStr := (*[128]byte)(unsafe.Pointer(outstr))
	copy((*bytOutStr)[:*outlen], bytOut)
	return 0
}

//  1. 取特征码
//     参数:
//     custname 客户名称
//     outstr【输出】 返回信息
//     outlen【输出】 返回信息长度
//     返回:
//     0 成功,非0 失败
//
//export GetSysCode
func GetSysCode(custname *C.char, outstr *C.char, outlen *C.int) C.int {
	sou := ""
	syscode, err := GetSysCode(C.GoString(custname))
	if err != nil {
		sou = fmt.Sprintf("取特征码失败,%v", err)
		return setOutStr(301, sou, outstr, outlen)
	}
	sou = syscode
	return setOutStr(0, sou, outstr, outlen)
}

// retcode 0 成功,非0 失败
func setOutStr(retcode int, in string, outstr *C.char, outlen *C.int) C.int {
	sou := in

	if int(*outlen) <= len(sou) {
		sou = fmt.Sprintf("At least %d bytes buffer are required.", len([]byte(sou))+1)
		bytOut := []byte(sou)
		bytOut = append(bytOut, 0)
		*outlen = C.int(len(bytOut))
		bytOutStr := (*[409600]byte)(unsafe.Pointer(outstr))
		copy((*bytOutStr)[:*outlen], bytOut)

		return 101
	}

	bytOut := []byte(sou)
	bytOut = append(bytOut, 0)
	*outlen = C.int(len(bytOut))
	bytOutStr := (*[409600]byte)(unsafe.Pointer(outstr))
	copy((*bytOutStr)[:*outlen], bytOut)

	return C.int(retcode)
}

windows动态库lib文件生成

  • 编写.def文件,使用lib.exe工具生成
LIBRARY
EXPORTS
    IntAdd
    GoPrint
  • 生成工具
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin)
  • 生成
# 64位
lib /def:deffile.def /machine:x64 /out:libfile.lib
# 32位
lib /def:deffile.def /machine:x86 /out:libfile.lib
posted @   jiftle  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
点击右上角即可分享
微信分享提示