繁体   English   中英

编译SQLite for Windows(64位)

[英]Compiling SQLite for Windows (64-bit)

我有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

你正在编译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就是告诉GCC传递关于进一步论证--out-IMPLIB,libexample_dll.a给链接器。

我还要100%确定构建的DLL实际上是64位DLL而不是32位DLL。 你有办法检查吗? 在Linux上,您可以运行“file”命令。

您还可以尝试将-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和导入文件的名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM