php エディタ Baicao では、gcc (mingw32) を使用して静的ライブラリを含む DLL をコンパイルする方法を紹介します。開発プロセス中、他のプロジェクトで簡単に呼び出せるように、静的ライブラリを DLL にパッケージ化することが必要になることがよくあります。 gcc (mingw32) を使用して静的ライブラリを含む DLL をコンパイルする方法は比較的簡単で、特定の手順に従うだけです。まず、mingw32 および gcc コンパイラーがインストールされていることを確認してください。次に、コマンド ラインに gcc -shared -o libname.dll libname.a と入力して、DLL ファイルを生成します。このようにして、静的ライブラリを他のプロジェクトで使用する DLL に簡単にコンパイルできます。
外部ツール (つまり cgo) によって生成された静的ライブラリがあります。これを libsecondary.a と呼びます。 「libsecondary.a」を依存関係として含めながらダイナミック ライブラリを生成したいと思います。libsecondary.h 内の onprocessinit() という関数をエクスポートし、dll_process_attach イベントで呼び出します。
共有ライブラリを生成しようとしましたが、機能しないようです x86_64-w64-mingw32-share-l。 -lsecondary -static-libgcc -static-libstdc -static .\dllmain.c
エラー出力は次のとおりです。 dllmain.c:(.text 0x9b): 'onprocessinit' への未定義の参照、何が起こっていますか?
これはヘッダー ファイル libsecondary.h
です。 リーリーこれは dllmain.cです
65be0f35ebbcbcこれはエクスポートされた golang 関数です (go build -buildmode=c-archive を使用してコンパイルした関数)
/* 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
うわー、答えは引数の位置です、
x86_64-w64-mingw32 -shared -static-libgcc -static-libstdc -static .\dllmain.c .\libsecondary.a
逆に入力すると、libsecondary.a、OMG...
からの参照が見つかりません。syscall.NewLazyDLL が LoadLibraryA を呼び出し、DLL_PROCESS_ATTACH でロックされているため、上記のコードもロード時にデッドロックになります。そのため、解決策は CreateThread を作成し、スレッド内で golang でエクスポートされた関数を実行することです :)
以上がgcc を使用して静的ライブラリを使用して DLL をコンパイルする (mingw32)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。