web-dev-qa-db-ja.com

Go 1.7でdllを構築する

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

12
Stef

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で動作させることができました。

10
Andrew Dolder
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を生成します

21
user7155193

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

11
Another Prog