10

私はMinGWを持っていて、SQLiteアマルガメーションソースを64ビットdllにコンパイルしたいと思っています。私はこの種のコンパイルにかなり慣れていませんが、これまでの努力は失敗に終わりました。(私は最初にautoconfの融合を使い始め、Linuxでconfigure&makeツールを使いました。しかし、どうやらそれはWindowsバイナリでは機能しないようです。)

とにかく、私は次のプリプロセッサ定義が必要だと言われました:

64ビットリリースビルドに使用するコンパイラプリプロセッサ定義は次のとおりです。

  • WIN64 NDEBUG
  • _ウィンドウズ
  • _USRDLL
  • NO_TCL
  • _CRT_SECURE_NO_DEPRECATE
  • THREADSAFE = 1
  • TEMP_STORE = 1
  • SQLITE_MAX_EXPR_DEPTH = 0

32ビットリリースビルドに使用するコンパイラプリプロセッサ定義は次のとおりです。

  • WIN32
  • NDEBUG
  • _ウィンドウズ
  • _USRDLL
  • NO_TCL
  • _CRT_SECURE_NO_DEPRECATE
  • THREADSAFE = 1
  • TEMP_STORE = 1
  • SQLITE_MAX_EXPR_DEPTH = 0

私はこれらをどこに入れるべきかわかりませんでした。私は最終的に知識に基づいた推測を行い、sqlite3w64.hという名前の新しいファイル(きちんとしたもの)を作成し、次のように貼り付けました。

#define WIN64 NDEBUG
#define _WINDOWS
#define _USRDLL
#define NO_TCL
#define _CRT_SECURE_NO_DEPRECATE
#define THREADSAFE 1
#define TEMP_STORE 1
#define SQLITE_MAX_EXPR_DEPTH 0

次に、次のコマンドを使用してソースをコンパイルしました。

gcc sqlitew64.h sqlite3.h sqlite3ext.h shell.c sqlite3.c -o sqlite_x64.dll

結果として、733KBのDLLファイルが作成されました。良い!それは実際に機能しましたか?やりました-BadImageFormatExceptionが発生しました。次に、同じ方法を使用してx86コンパイルを実行してみました。もう一度、733KBのDLLファイルを取得し(それは奇妙ですか?)、もう一度、BadImageFormatExceptionを取得しました。

ヘルプ。

アップデート

代わりに次のコマンドを使用しました。

gcc -shared -DWIN64 -DNDEBUG -D_WINDOWS -D_USRDLL -DNO_TCL -D_CRT_SECURE_NO_DEPRECATE -DTHREADSAFE=1 -DTEMP_STORE=1 -DSQLITE_MAX_EXPR_DEPTH=0 -I. shell.c sqlite3.c -o sqlite_x64.dll -Wl,--out-implib,sqlite3.a

740KBのDLLファイルが生成されましたが、それでもBadImageFormatExceptionが発生します。

最終更新

私のMinGWビルドは32ビットのみでした。64ビットバージョンを入手すると、64ビット用のSQLiteを作成できました。フラグ-m64を追加すると、コンパイラが64ビットモードに設定されます。

64ビット:

gcc -shared -DWIN64 -DNDEBUG -D_WINDOWS -D_USRDLL -DNO_TCL -D_CRT_SECURE_NO_DEPRECATE -DTHREADSAFE=1 -DTEMP_STORE=1 -DSQLITE_MAX_EXPR_DEPTH=0 -m64 -I. shell.c sqlite3.c -o sqlite3_x64.dll -Wl,--out-implib,sqlite3_x64.a

32ビット:

gcc -shared -DWIN32 -D_WINDOWS -D_USRDLL -DNO_TCL -D_CRT_SECURE_NO_DEPRECATE -DTHREADSAFE=1 -DTEMP_STORE=1 -DSQLITE_MAX_EXPR_DEPTH=0 -m32 -I. shell.c sqlite3.c -o sqlite3_x86.dll -Wl,--out-implib,sqlite3_x86.a

MinGW-64プリコンパイル済み:http ://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Automated%20Builds/mingw-w64-bin_i686-mingw_20111220.zip/download?use_mirror = ignum

インストール手順:http ://code.google.com/p/tonatiuh/wiki/InstallingMinGWForWindows64

4

2 に答える 2

7

EXEにコンパイルしています。これをDLLと呼んでも、魔法のようにDLLになるわけではありませ

DLLを作成するには、特別なリンカーオプションをgccに渡す必要があります。Mingwサイトからの引用:(並べ替え、g ++をgccに置き換えました)

gcc -c -DBUILDING_EXAMPLE_DLL example_dll.cpp
gcc -shared -o example_dll.dll example_dll.o -Wl,--out-implib,libexample_dll.a

このページでは、DLLにエクスポートする関数は、で宣言する必要があることも説明されています__declspec(dllexport)。(さらに、Unixで通常行われるように、すべてのグローバル関数をDLLにエクスポートする方法の例があります。)

gccへの-Wl引数は、さらに引数--out-implib、libexample_dll.aをリンカーに渡すようにgccに指示するものです。

また、ビルドされたDLLが実際には64ビットDLLであり、32ビットDLLではないことを100%確認します。それを確認する方法はありますか?Linuxでは、「file」コマンドを実行できます。

-m64gccコマンドラインにオプションを追加してみることもできます。これにより、gccはamd64ターゲットをターゲットにする必要があります。

それが機能しない場合は、コンパイラが完全に間違っている可能性があります。Mingwツールチェーンのx86_64/amd64バージョンがあることを確認してください。インストールは、適切なZIPを見つけて解凍し、パスを設定するのと同じくらい簡単です。

それがすべて失敗した場合、または正しくコンパイルされたと思われるセットアップに対して検証したい場合は、ここまたはここからプリコンパイルされた64ビットバイナリを試してください。

于 2012-06-11T10:14:52.740 に答える
4

あなたの場合に機能するのは、この単一のリンクアンドコンパイルコマンドです。

g++ -shared
-DWIN64
-DNDEBUG
-D_WINDOWS
-D_USRDLL
-DNO_TCL
-D_CRT_SECURE_NO_DEPRECATE
-DTHREADSAFE=1
-DTEMP_STORE=1
-DSQLITE_MAX_EXPR_DEPTH=0
-I.
shell.c sqlite3.c
-o sqlite_x64.dll
-Wl,--out-implib,libsqllite_x64.dll.a

コンパイルとリンクの段階は一度に実行されます。定義されたものは、コマンドラインで追加できます。ヘッダーをコンパイルする必要はありませんが、現在のディレクトリをヘッダー検索ディレクトリとして渡し、dllとインポートファイルの名前を指定する必要があります。

于 2012-06-11T10:21:35.030 に答える