编译用于Windows的SQLite(64位)

我有MinGW,我希望将SQLite融合源编译成64位的DLL。 我对这种汇编还比较陌生,迄今为止我的努力都导致了失败。 (我首先开始使用autoconf合并,并使用Linux上的configure&make工具,但显然这对于​​Windows二进制文件来说是无效的)。

无论如何,我被告知我需要以下预处理器定义:

以下是我用于64位版本构build的编译器预处理器定义:

  • WIN64 NDEBUG
  • _视窗
  • _USRDLL
  • NO_TCL
  • _CRT_SECURE_NO_DEPRECATE
  • THREADSAFE = 1
  • TEMP_STORE = 1
  • SQLITE_MAX_EXPR_DEPTH = 0

以下是我用于32位版本构build的编译器预处理器定义:

  • 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

您正在编译为EXE。 调用它一个DLL不会神奇地使它成为一个DLL。

您需要将特殊的链接器选项传递给gcc使其创建DLL。 引用Mingw网站:( 排序,我用gcc替换了g ++)

 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)声明。 (更进一步,有一个关于如何将所有全局函数导出到DLL的例子,就像通常在Unix中发生的那样)。

gcc 的-Wl参数告诉g​​cc将进一步的参数–out-implib,libexample_dll.a传递给链接器。

我也会百分之百地确定,构建的DLL实际上是一个64位的DLL,而不是一个32位的DLL。 你有什么办法来检查? 在Linux上,您可以运行“文件”命令。

您也可以尝试将-m64选项添加到gcc命令行,这应该强制 gcc将目标定位到amd64。

如果不起作用,你可能会有错误的编译器。 确保你有Mingw工具链的x86_64 / amd64版本 。 安装非常简单,只需找到合适的ZIP文件,将其解压缩,然后设置路径即可 。

如果所有这些都失败了,或者你只是想对一个被认为是正确编译的安装程序进行验证,请尝试在这里或从这里 预编译的64位二进制文​​件 。

在你的情况下,这将是唯一的链接和编译命令:

 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和导入文件的名称。