Maison > développement back-end > Golang > le corps du texte

Compiler la DLL avec la bibliothèque statique en utilisant gcc (mingw32)

PHPz
Libérer: 2024-02-09 10:00:11
avant
970 Les gens l'ont consulté

使用 gcc (mingw32) 编译带有静态库的 DLL

l'éditeur php Baicao vous présentera comment utiliser gcc (mingw32) pour compiler une DLL avec une bibliothèque statique. Au cours du processus de développement, il est souvent nécessaire de regrouper des bibliothèques statiques dans des DLL pour faciliter leur appel dans d'autres projets. La méthode d'utilisation de gcc (mingw32) pour compiler une DLL avec une bibliothèque statique est relativement simple, il suffit de suivre certaines étapes. Tout d’abord, assurez-vous que les compilateurs mingw32 et gcc sont installés. Ensuite, entrez gcc -shared -o libname.dll libname.a sur la ligne de commande pour générer le fichier DLL. De cette façon, vous pouvez facilement compiler la bibliothèque statique dans une DLL pour l'utiliser dans d'autres projets.

Contenu de la question

J'ai une bibliothèque statique générée par un outil externe (c'est-à-dire cgo), appelons-la libsecondary.a. Je souhaite générer une bibliothèque dynamique tout en incluant "libsecondary.a" comme dépendance, j'exporte une fonction appelée onprocessinit() dans libsecondary.h et l'appelle sur l'événement dll_process_attach.

J'ai essayé de générer la bibliothèque partagée mais cela ne semble pas fonctionner x86_64-w64-mingw32-share-l. -lsecondaire -static-libgcc -static-libstdc++ -static .dllmain.c

La sortie d'erreur est dllmain.c:(.text+0x9b) : référence non définie à 'onprocessinit', que se passe-t-il ?

Voici le fichier d'en-tête libsecondary.h

/* code generated by cmd/cgo; do not edit. */

/* package command-line-arguments */


#line 1 "cgo-builtin-export-prolog"

#include <stddef.h>

#ifndef go_cgo_export_prologue_h
#define go_cgo_export_prologue_h

#ifndef go_cgo_gostring_typedef
typedef struct { const char *p; ptrdiff_t n; } _gostring_;
#endif

#endif

/* start of preamble from import "c" comments.  */




/* end of preamble from import "c" comments.  */


/* start of boilerplate cgo prologue.  */
#line 1 "cgo-gcc-export-header-prolog"

#ifndef go_cgo_prologue_h
#define go_cgo_prologue_h

typedef signed char goint8;
typedef unsigned char gouint8;
typedef short goint16;
typedef unsigned short gouint16;
typedef int goint32;
typedef unsigned int gouint32;
typedef long long goint64;
typedef unsigned long long gouint64;
typedef goint64 goint;
typedef gouint64 gouint;
typedef size_t gouintptr;
typedef float gofloat32;
typedef double gofloat64;
#ifdef _msc_ver
#include <complex.h>
typedef _fcomplex gocomplex64;
typedef _dcomplex gocomplex128;
#else
typedef float _complex gocomplex64;
typedef double _complex gocomplex128;
#endif

/*
  static assertion to make sure the file is being used on architecture
  at least with matching size of goint.
*/
typedef char _check_for_64_bit_pointer_matching_goint[sizeof(void*)==64/8 ? 1:-1];

#ifndef go_cgo_gostring_typedef
typedef _gostring_ gostring;
#endif
typedef void *gomap;
typedef void *gochan;
typedef struct { void *t; void *v; } gointerface;
typedef struct { void *data; goint len; goint cap; } goslice;

#endif

/* end of boilerplate cgo prologue.  */

#ifdef __cplusplus
extern "c" {
#endif

extern __declspec(dllexport) void onprocessinit();

#ifdef __cplusplus
}
#endif
Copier après la connexion

Voici dllmain.c

65be0f35ebbcbc

Il s'agit de la fonction golang exportée (la fonction que j'ai compilée en utilisant go build -buildmode=c-archive)

package main
import "C"
import (
    "unsafe"
    "syscall"
)

//export OnProcessInit
func OnProcessInit() {
    const (
        NULL  = 0
        MB_OK = 0
    )
    caption := "Hola"
    title := "desdegoo"
    ret, _, _ := syscall.NewLazyDLL("user32.dll").NewProc("MessageBoxW").Call(
        uintptr(NULL),
        uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(caption))),
        uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(title))),
        uintptr(MB_OK))

    if ret != 1 {
        return
    }
    return 
}

func main() {}
Copier après la connexion

Solution

Wow, la réponse est la position de l'argument,

x86_64-w64-mingw32 -shared -static-libgcc -static-libstdc++ -static .dllmain.c .libsecondary.a

Si vous le tapez à l'envers, il ne trouvera pas la référence de libsecondary.a, mon Dieu...

Le code ci-dessus se retrouve également dans une impasse lors du chargement car syscall.NewLazyDLL appelle LoadLibraryA et il est verrouillé dans DLL_PROCESS_ATTACH, donc la solution de contournement consiste à CreateThread et à exécuter la fonction golang exportée dans le fil :)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!