Existe-t-il un moyen de créer une DLL contre Go v1.7 sous Windows?
J'ai essayé un classique
go build -buildmode=shared main.go
mais obtenez
-buildmode = partagé non pris en charge sur Windows/AMD64
mise à jour Ok, j'ai ma réponse. Pour ceux qui sont intéressés: https://groups.google.com/forum/#!topic/golang-dev/ckFZAZbnjz
Depuis Go 1.10, -buildmode = c-shared est désormais pris en charge sous Windows.
Notes de version: https://golang.org/doc/go1.10#compiler
Alors maintenant, la compilation en DLL est une ligne:
go build -o helloworld.dll -buildmode=c-shared
Je pense que les en-têtes ne sont compatibles qu'avec GCC. Si vous exposez uniquement des types C, cela ne devrait pas être un gros problème. J'ai pu faire fonctionner LoadLibrary dans Visual Studio sans l'en-tête.
go build -buildmode=c-archive github.com/user/ExportHello
====> va construire ExportHello.a
, ExportHello.h
Prenez les fonctions intégrées dans ExportHello.a
et réexportez dans Hello2.c
gcc -shared -pthread -o Hello2.dll Hello2.c ExportHello.a -lWinMM -lntdll -lWS2_32
====> va générer Hello2.dll
Il y a un projet sur github qui montre comment créer une DLL, basé sur, et grâce à la réponse de user7155193.
Fondamentalement, vous utilisez GCC pour construire le DLL à partir des fichiers .a et .h générés par golang.
Vous créez d'abord un simple fichier Go qui exporte une fonction (ou plus).
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
}
Compilez-le avec:
go build -buildmode=c-archive exportgo.go
Ensuite, vous créez un programme C (goDLL.c) qui liera les fichiers .h et .a générés ci-dessus
#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() {
}
Compiler/lier le DLL avec GCC:
gcc -shared -pthread -o goDLL.dll goDLL.c exportgo.a -lWinMM -lntdll -lWS2_32
Le goDLL.dll peut ensuite être chargé dans un autre programme C, un programme freepascal/lazarus ou votre programme de choix.
Le code complet avec un projet lazarus/fpc qui charge le DLL est ici: https://github.com/z505/goDLL