使用 Go 1.7 构建一个 dll

Building a dll with Go 1.7

有没有办法在 Windows 下构建针对 Go v1.7 的 dll?

我尝试了经典

go build -buildmode=shared main.go

但得到

-buildmode=shared not supported on windows/amd64

更新 好的,我得到了答案。对于那些有兴趣的人: https://groups.google.com/forum/#!topic/golang-dev/ckFZAZbnjzU

go build -buildmode=c-archive github.com/user/ExportHello

====> 将构建 ExportHello.aExportHello.h

获取 ExportHello.a 中的内置函数并在 Hello2.c

中重新导出
gcc -shared -pthread -o Hello2.dll Hello2.c ExportHello.a -lWinMM -lntdll -lWS2_32

====> 将生成 Hello2.dll

github 上有一个项目展示了如何创建 DLL,基于并感谢 user7155193 的回答。

基本上,您使用 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),它将link在上面生成的.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() {

}

Compile/link 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

从 Go 1.10 开始,-buildmode=c-shared 现在支持 Windows。

发行说明: https://golang.org/doc/go1.10#compiler

所以现在编译成DLL是one-liner:

go build -o helloworld.dll -buildmode=c-shared

我相信 headers 只与 GCC 兼容。如果您只公开 C-types,这应该不是什么大问题。在没有 header.

的情况下,我能够让 LoadLibrary 在 Visual Studio 中工作