c - 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 的十分之一,我怀疑问题存在 - 但仍然看不到为什么不输出“开始”。
解决方案
推荐阅读
- firebase - 如何在所有数据库实例上触发firebase函数而不是默认一个?
- vue.js - Vue.Draggable 不允许我在列表之间移动项目
- fortran - 为什么我必须为 Fortran 中函数的双精度返回值隐式指定?
- c# - 如何将对象列表与列表属性数据绑定?
- java - 当我有太多空白时,CharAt(0) 越界异常
- swift - `NSAttibutedString` 如何等同于`Any` 类型的属性值?
- javascript - 使用量角器在 E2E 测试中在一个“它”中运行几个小测试
- neo4j - 找到符合三个标准neo4j的特定节点
- javascript - 反应测量,获得两个兄弟元素中最宽的宽度?
- swift - 如果让 Swift Xcode 10.1 中的代码抛出线程 1:信号 SIGABART,为什么会这样?