Heim > Backend-Entwicklung > Golang > Kompilieren Sie die DLL mit der statischen Bibliothek mithilfe von gcc (mingw32).

Kompilieren Sie die DLL mit der statischen Bibliothek mithilfe von gcc (mingw32).

PHPz
Freigeben: 2024-02-09 10:00:11
nach vorne
1022 Leute haben es durchsucht

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

php-Editor Baicao stellt Ihnen vor, wie Sie mit gcc (mingw32) eine DLL mit einer statischen Bibliothek kompilieren. Während des Entwicklungsprozesses ist es oft notwendig, statische Bibliotheken in DLLs zu packen, um sie in anderen Projekten einfach aufrufen zu können. Die Methode, mit gcc (mingw32) eine DLL mit einer statischen Bibliothek zu kompilieren, ist relativ einfach. Befolgen Sie einfach bestimmte Schritte. Stellen Sie zunächst sicher, dass Sie die Compiler mingw32 und gcc installiert haben. Geben Sie dann gcc -shared -o libname.dll libname.a in die Befehlszeile ein, um die DLL-Datei zu generieren. Auf diese Weise können Sie die statische Bibliothek problemlos in eine DLL kompilieren, um sie in anderen Projekten zu verwenden.

Frageninhalt

Ich habe eine statische Bibliothek, die von einem externen Tool (z. B. CGO) generiert wurde. Nennen wir sie libsecondary.a. Ich möchte eine dynamische Bibliothek generieren und dabei „libsecondary.a“ als Abhängigkeit einbeziehen. Ich exportiere eine Funktion namens onprocessinit() in libsecondary.h und rufe sie beim Ereignis dll_process_attach auf.

Ich habe versucht, die gemeinsam genutzte Bibliothek zu generieren, aber es scheint nicht zu funktionieren x86_64-w64-mingw32-share-l. -lsecondary -static-libgcc -static-libstdc++ -static .dllmain.c

Die Fehlerausgabe lautet dllmain.c:(.text+0x9b): Undefinierter Verweis auf „onprocessinit“, was ist los?

Dies ist die Header-Datei 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
Nach dem Login kopieren

Das ist dllmain.c

65be0f35ebbcbc

Dies ist die exportierte Golang-Funktion (die Funktion, die ich mit go build -buildmode=c-archive kompiliert habe)

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() {}
Nach dem Login kopieren

Lösung

Wow, die Antwort ist Argumentposition,

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

Wenn Sie es rückwärts eingeben, wird die Referenz von libsecondary.a nicht gefunden, omg...

Der obige Code gerät beim Laden auch in einen Deadlock, weil syscall.NewLazyDLL LoadLibraryA aufruft und in DLL_PROCESS_ATTACH gesperrt ist. Die Problemumgehung besteht also darin, CreateThread zu erstellen und die Golang-Exportfunktion innerhalb des Threads auszuführen :)

Das obige ist der detaillierte Inhalt vonKompilieren Sie die DLL mit der statischen Bibliothek mithilfe von gcc (mingw32).. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage