用Go 1.7构建一个dll

时间:2016-11-13 11:41:38

标签: windows go dll mingw-w64

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

我尝试过经典

go build -buildmode=shared main.go

但是

  

-buildmode =在windows / amd64上不支持共享

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

3 个答案:

答案 0 :(得分:20)

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

答案 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中工作。