web-dev-qa-db-fra.com

Construire une DLL avec Go 1.7

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

12
Stef

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.

10
Andrew Dolder
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

21
user7155193

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

11
Another Prog