WindowsでGo v1.7に対してdllをビルドする方法はありますか?
クラシックを試した
go build -buildmode=shared main.go
しかし、得る
-buildmode = sharedはwindows/AMD64ではサポートされていません
updateOK、答えがわかりました。興味がある人のために: https://groups.google.com/forum/#!topic/golang-dev/ckFZAZbnjz
Go 1.10の時点で、-buildmode = c-sharedがWindowsでサポートされるようになりました。
リリースノート: https://golang.org/doc/go1.10#compiler
したがって、DLLにコンパイルするのはワンライナーです:
go build -o helloworld.dll -buildmode=c-shared
ヘッダーはGCCとのみ互換性があると思います。 Cタイプのみを公開する場合、これは大きな問題にはなりません。 LoadLibraryをヘッダーなしでVisual Studioで動作させることができました。
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には、user7155193の回答に基づいて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
次に、上記で生成された.hおよび.aファイルにリンクするCプログラム(goDLL.c)を作成します
#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