【发布时间】:2016-01-25 15:37:45
【问题描述】:
我有一个简单的 hello world c++ 程序,它链接 sqlite3.dll(64 位版本)。
我已在各自的路径中正确添加了 sqlite3.h 和 sqlite3.dll。这些项目针对 64 位架构进行编译。编译和链接很顺利。
当我尝试运行 exe 时出现问题。
我在这里看到很多建议使用依赖遍历器的问题。我把截图放在这里:
我不明白为什么它会失败,因为 sqlite3.dll 在 exe 的文件夹中。如果我理解得很好,依赖步行者就会找到它。 arch 列是所有的 x64。
源代码:
#include <iostream>
#include "sqlite3.h"
int main()
{
std::cout<< "Hello world and all that" << std::endl;
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));
exit(0);
}else{
fprintf(stderr, "Opened database successfully\n");
}
sqlite3_close(db);
return 0;
}
如果 exe 和 dll 都是 64 位,我还使用了以下实用程序:PE Deconstructor。而且它们都是 64 位的。
编辑
我已经按照中的说明自行编译了 sqlite3.dll
https://www.sqlite.org/howtocompile.html
使用以下说明:
1) 加载vcvars32.bat amd64
2) 然后我 cd in:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64
3) 并启动命令:
cl sqlite3.c -link -dll -out:sqlite3.dll /MACHINE:x64
编辑 2
我尝试使用以下命令将官方的 sqlite3.dll + sqlite3.def(x64 二进制文件)转换为 sqlite3.lib:
lib /def:sqlite3.def /OUT:sqlite3.lib /MACHINE:x64
没有运气,同样的错误。
编辑 3
我将 dll 放在错误的文件夹中(VS 有一个奇怪的输出目录树,名称重复)。现在将 official dll 放在正确的文件夹中它可以工作。
我还设法修复了我的自定义构建的 dll,请参阅接受的答案。我拿了官方的 sqlite3.def 文件并通过添加 /def 开关修改了编译命令。鉴于 def 是针对较新版本的 sqlite 的事实,链接器抱怨缺少一些符号。我从 sqlite3.def 文件中删除了这些符号,它正确编译了 dll 文件并生成了 .lib 和 .exp 文件。 (现在不需要 lib 命令,因为 lib 文件是直接创建的)。将新的 dll 放在正确的文件夹中就像一个魅力。
请不要将问题归类为重复。
谢谢
【问题讨论】:
-
不要害怕,只有重复项作为重复项关闭。 :-)
-
据我所知,您的 DLL 编译时似乎没有任何导出,可能是编译过程中丢失了某些 DEF 文件?您的 sqlite3.dll 没有任何导出表条目。将 /DEF:sqlite3.def 添加到您的 sqlite 编译命令中
-
他们将 DEF 文件放入二进制包中:sqlite.org/2015/sqlite-dll-win64-x64-3090100.zip。下载 DEF 文件并将 /DEF 参数添加到您的
cl命令 -
谢谢,但请参阅 EDIT 2
-
@72DFBF5BA0DF5BE9。有两个问题。 1)我将 dll 放在错误的文件夹中(VS 有一个奇怪的输出目录树,名称重复)。这就是为什么官方 dll 无法正常工作的原因。 2) 自定义构建 dll 缺少导出表。我通过添加 /def 和官方 sqlite 页面的 def 文件来修改编译命令。鉴于我正在编译旧版本,因此缺少一些导出,因此我将它们从 def 文件中删除。一切正常!请添加答案,我会接受!
标签: c++ visual-studio-2010 dll linker