有没有办法在Windows下针对Go v1.7构建一个dll?
我尝试过经典
go build -buildmode=shared main.go
但是
-buildmode =在windows / amd64上不支持共享
更新 好的,我有答案。对于那些感兴趣的人: https://groups.google.com/forum/#!topic/golang-dev/ckFZAZbnjzU
答案 0 :(得分:20)
go build -buildmode=c-archive github.com/user/ExportHello
====>将构建ExportHello.a
,ExportHello.h
使用ExportHello.a
中内置的功能并在Hello2.c
gcc -shared -pthread -o Hello2.dll Hello2.c ExportHello.a -lWinMM -lntdll -lWS2_32
====>将生成Hello2.dll
答案 1 :(得分:10)
github上有一个项目,它显示了如何基于用户7155193的答案来创建DLL。
基本上你使用GCC从golang生成的.a和.h文件构建DLL。
首先,您创建一个导出函数(或更多)的简单Go文件。
package main
import "C"
import "fmt"
//export PrintBye
func PrintBye() {
fmt.Println("From DLL: Bye!")
}
func main() {
// Need a main function to make CGO compile package as C shared library
}
用以下内容编译:
go build -buildmode=c-archive exportgo.go
然后你制作一个C程序(goDLL.c),它将链接上面生成的.h和.a文件
#include <stdio.h>
#include "exportgo.h"
// force gcc to link in go runtime (may be a better solution than this)
void dummy() {
PrintBye();
}
int main() {
}
使用GCC编译/链接DLL:
gcc -shared -pthread -o goDLL.dll goDLL.c exportgo.a -lWinMM -lntdll -lWS2_32
然后可以将goDLL.dll加载到另一个C程序,freepascal / lazarus程序或您选择的程序中。
带有加载DLL的lazarus / fpc项目的完整代码在这里: https://github.com/z505/goDLL
答案 2 :(得分:9)
从Go 1.10开始,Windows现在支持-buildmode = c-shared。
发行说明: https://golang.org/doc/go1.10#compiler
所以现在编译为DLL是一种方法:
go build -o helloworld.dll -buildmode=c-shared
我相信这些标头仅与GCC兼容。如果仅公开C类型,这应该不是大问题。我可以使LoadLibrary在没有标题的情况下在Visual Studio中工作。