【发布时间】:2017-12-08 06:11:57
【问题描述】:
我有一个 Microsoft Visual Code 2017 控制台应用程序,我想将它静态链接到 sqlite3。我已经链接了sqlite3.lib 文件并包含了sqlite3.h 文件。但是,当我执行程序时,它仍然会弹出缺少sqlite3.dll 的消息。我以为sqlite3会静态链接,我做错了什么?
编译没有错误
这是我的代码:
#include "stdafx.h"
#include "sqlite3.h"
#pragma comment(lib, "sqlite3.lib")
static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
int i;
for(i=0; i<argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int main(int argc, _TCHAR* argv[]) {
sqlite3 *db;
char *zErrMsg = 0;
int rc;
rc = sqlite3_open("test.db", &db);
if( rc ) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
rc = sqlite3_exec(db, "create table stuff ( name )", callback, 0, &zErrMsg);
rc = sqlite3_exec(db, "insert into stuff values ('hello')", callback, 0, &zErrMsg);
rc = sqlite3_exec(db, "select * from stuff", callback, 0, &zErrMsg);
if(rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
sqlite3_close(db);
return 0;
}
【问题讨论】:
-
您将再次链接刚刚定义 DLL 入口点的“存根”库。您需要完整的 SQLite 静态构建库。你从哪里得到的官方网站的下载只有MS Windows sqlite.org/download.html的源代码和DLL?
-
忠告——如果 SqlLite 没有预先提供静态库,那么您自己创建一个静态库需要您做的不仅仅是简单的构建。如果没有这样的预建库,作者很可能认为创建这样的库是不可能或任务太多的。必须更改定义,必须定义/未定义预处理器符号等。
-
@TVAvanHesteren -- 静态库必须使用与您正在使用的编译器完全相同的版本构建,使用与您正在使用的版本相同的运行时库等等。我高度怀疑,除非作者花费了过多的时间,为您构建了与您的编译器完美匹配的静态库。
-
是的,如果作者允许分发,您必须分发 sqllite.dll。如果你真的想构建静态库,你需要获取所有的源代码,并获得作者关于如何构建库的指导和说明。除非您确切地知道自己在做什么,否则您不能独自完成这件事。
-
我相信有一些实用程序可以打包 DLL,以便它们对您的应用程序用户“隐藏”(当您的应用程序运行时它们会展开)。也许你应该考虑使用类似的东西(虽然不知道它们的效果如何)。
标签: c++ visual-studio sqlite visual-studio-2017 static-linking