Susun DLL dengan perpustakaan statik menggunakan gcc (mingw32)

PHPz
Lepaskan: 2024-02-09 10:00:11
ke hadapan
970 orang telah melayarinya

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

editor php Baicao akan memperkenalkan anda cara menggunakan gcc (mingw32) untuk menyusun DLL dengan perpustakaan statik. Semasa proses pembangunan, selalunya perlu untuk membungkus perpustakaan statik ke dalam DLL untuk memudahkan panggilan dalam projek lain. Kaedah menggunakan gcc (mingw32) untuk menyusun DLL dengan perpustakaan statik agak mudah, hanya ikuti langkah-langkah tertentu. Mula-mula, pastikan anda telah memasang pengkompil mingw32 dan gcc. Kemudian, masukkan gcc -shared -o libname.dll libname.a pada baris arahan untuk menjana fail DLL. Dengan cara ini anda boleh menyusun perpustakaan statik ke dalam DLL dengan mudah untuk digunakan dalam projek lain.

Kandungan soalan

Saya mempunyai perpustakaan statik yang dijana oleh alat luaran (iaitu cgo), mari kita panggil ia libsecondary.a. Saya ingin menjana perpustakaan dinamik sambil memasukkan "libsecondary.a" sebagai kebergantungan, saya mengeksport fungsi yang dipanggil onprocessinit() dalam libsecondary.h dan memanggilnya pada acara dll_process_attach.

Saya cuba menjana perpustakaan kongsi tetapi nampaknya tidak berfungsi x86_64-w64-mingw32-share-l. -lsecondary -static-libgcc -static-libstdc++ -static .dllmain.c

Keluaran ralat ialah dllmain.c:(.text+0x9b): Rujukan tidak ditentukan kepada 'onprocessinit', apa yang sedang berlaku?

Ini ialah fail pengepala 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
Salin selepas log masuk

Ini adalah dllmain.c

65be0f35ebbcbc

Ini ialah fungsi golang yang dieksport (fungsi yang saya susun menggunakan 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() {}
Salin selepas log masuk

Penyelesaian

Wah, jawapannya ialah kedudukan hujah,

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

Jika anda menaipnya ke belakang, ia tidak akan menemui rujukan dari libsecondary.a, omg...

Kod di atas juga menemui jalan buntu apabila memuatkan kerana syscall.NewLazyDLL memanggil LoadLibraryA dan ia dikunci dalam DLL_PROCESS_ATTACH, jadi penyelesaiannya adalah dengan CreateThread dan jalankan fungsi eksport golang di dalam benang :)

Atas ialah kandungan terperinci Susun DLL dengan perpustakaan statik menggunakan gcc (mingw32). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!