使用 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.a
、ExportHello.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 中工作
有没有办法在 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.a
、ExportHello.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 中工作