我有MinGW,我希望将SQLite amalgamation source编译成64位dll。我对这种编辑很新,到目前为止我的努力导致了失败。 (我第一次开始使用autoconf amalgamation并在Linux上使用configure& make工具。但显然这对于Windows二进制文件永远不会起作用。)
无论如何,我被告知我需要以下预处理器定义:
以下是我用于64位版本构建的编译器预处理器定义:
- WIN64 NDEBUG
- _WINDOWS
- _USRDLL
- NO_TCL
- _CRT_SECURE_NO_DEPRECATE
- THREADSAFE = 1
- TEMP_STORE = 1
- SQLITE_MAX_EXPR_DEPTH = 0
以下是我用于32位版本构建的编译器预处理器:
- WIN32
- NDEBUG
- _WINDOWS
- _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
安装说明:http://code.google.com/p/tonatiuh/wiki/InstallingMinGWForWindows64
答案 0 :(得分:7)
您正在编译EXE。将它称为DLL不会神奇地使它成为DLL。
您需要将special linker options传递给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 参数告诉gcc将更多参数 - out-implib,libexample_dll.a 传递给链接器。
我还要 100%确保构建的DLL实际上是64位DLL而不是32位DLL。你有办法检查吗?在Linux上,您可以运行“file”命令。
您还可以尝试将-m64
选项添加到gcc命令行,该命令应强制 gcc以定位amd64目标。
如果 不起作用,您可能会完全使用错误的编译器。确保您拥有the x86_64/amd64 version of the Mingw toolchain。安装就像finding the right ZIP, unpacking it, and setting the path一样简单。
如果所有这些都失败了,或者您只想验证所谓的正确编译设置,请尝试precompiled 64-bit binaries here或from here。
答案 1 :(得分: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和import文件的名称。