首页 > 解决方案 > MINGW + SQLITE3 - DLL / 链接器问题

问题描述

尝试在 MINGW C 中调用 SQLITE3 函数 - 程序未按预期运行。我怀疑问题出在 .a 文件周围,但看不到没有输出的位置或原因。

在 c:\mingw 的 Windows 10 上从 nuwen.net 安装最新的 MinGW Distro。

C:\c>gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/x86_64-w64-mingw32/8.1.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../src/configure --enable-languages=c,c++ --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --disable-multilib --prefix=/c/temp/gcc/dest --with-sysroot=/c/temp/gcc/dest --disable-libstdcxx-pch --disable-libstdcxx-verbose --disable-nls --disable-shared --disable-win32-registry --with-tune=haswell --enable-threads=posix --enable-libgomp
Thread model: posix
gcc version 8.1.0 (GCC)

从 sqlite.org 下载 sqlite-amalgamation-3260000.zip、sqlite-dll-win64-x64-3260000.zip 和 sqlite-tools-win32-x86-3260000.zip。

标头 sqlite3.h 和 sqlite3ext.h 从 sqlite-amalgamation-3260000.zip 复制到 include\sqlite3 目录。

文件 sqlite3.def 和 sqlite3.dll 从 sqlite-dll-win64-x64-3260000.zip 提取到一个临时目录。

在临时目录中,我运行了 dlltool -U -d sqlite3.def -l libsqlite3.a (如http://www.mingw.org/wiki/createimportlibraries中所述)。(注意我尝试使用和不使用 -U 和 -k 标志)

没有消息输出,libsqlite3.a 文件大约 200K(尽管我注意到 .DLL 是 10 倍大小)。我将生成的 libsqlite3.a 复制到 lib 目录。

我写了一个快速的 test3.c 程序只是为了检查我可以正确调用一个 sqlite 函数:

#include <stdio.h>
#include "sqlite3\sqlite3.h"

sqlite3* db;

int main() {

    printf("Start\n");

    sqlite3_open("test.db", &db);

    if(db == 0) {
        printf("Could not open database.\n");
    }
    else {
    printf("Database Open \n");
    }
}

我使用以下代码编译没有错误:gcc test3.c -lsqlite3

我运行 a.exe 并没有看到任何东西 - 甚至没有打印出“开始”字符串

我只注释掉“sqlite3_open”行并使用相同的命令重新编译然后再次运行,我看到了

C:\c>a
Start
Could not open database.

由于调用 sqlite3 函数时行为出乎意料,并且 .a 文件的大小是 .DLL 的十分之一,我怀疑问题存在 - 但仍然看不到为什么不输出“开始”。

标签: csqlitemingw

解决方案


推荐阅读