ホームページ  >  記事  >  バックエンド開発  >  gcc を使用して静的ライブラリを使用して DLL をコンパイルする (mingw32)

gcc を使用して静的ライブラリを使用して DLL をコンパイルする (mingw32)

PHPz
PHPz転載
2024-02-09 10:00:11971ブラウズ

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

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 サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。