这个问题在这里已经有答案了:

我正在开发一个 MFC 应用程序,它需要一个嵌入式数据库。因此,我开始寻找一个灵活、快速的“嵌入式”数据库,并偶然发现了 SQLite。

我用它创建了一个数据库,并用 Visual Studio 2008 创建了一个静态库项目。该库项目将在另一个主项目中使用。

在图书馆项目中,我创建了一个类 DBClass 用一种方法 AddFeedToDB(CFeed f). 。图书馆项目使用 .lib 来自代码项目的文件(cppsqlite3.lib).

编译静态库时,没有检测到错误,但是当我尝试在主项目中使用库项目文件时,出现以下类型的错误:

error LNK2019: unresolved external symbol "public:void __thiscall
   CppSQLite3DB::close(void)" (?close@CppSQLite3DB@@QAEXXZ 
   referenced in function "public: int __thiscall
   CTalkingFeedsDB::AddFeedToDB(class CFeed,char const*)" (?
   AddFeedToDB@CTalkingFeedsDB@@QAEHVCFeed@@PDB@Z

我缺少什么?

有帮助吗?

解决方案

我不止一次地想到符号 XXX (IE。 ?close@CppSQLite3DB@@QAEXXZ) 曾是 在导入库中,而实际符号是 __impXXX (IE。 __imp?close@CppSQLite3DB@@QAEXXZ).

然后在编译步骤中找到链接器错误的原因:编译器将生成 ?close@CppSQLite3DB@@QAEXXZ 要导入的符号,在哪里 应该 产生 __imp?close@CppSQLite3DB@@QAEXXZ. 。这通常意味着函数声明本身没有 __declspec( dllimport ). 。这可能是由于某些未定义的预处理器符号引起的。或者 __declspec 根本不在场……

其他提示

我知道这个问题已经过去两年了......但我在这里遇到同样的情况。添加了所有头文件...添加了 lib 目录..并继续出现此错误。因此,我手动将库添加到配置属性 -> 链接器 -> 输入 -> 其他依赖项 一切都对我有用。

不知道这是否是你的情况,但 imp 前缀可能意味着你正在 Win32 项目中编译 x64 库。

您需要将代码项目 SQLite 库链接到可执行文件,或者直接将源文件包含在项目中。(你做了哪一件事?)

我会按照以下步骤操作:

  1. 考虑一下您希望通过哪个库或 .obj 文件导出该符号。

  2. 检查是否真的 导出该符号(按字符检查)。有时,这是调用约定不同。

  3. 检查链接器是否知道您希望包含该符号的库 - 首先检查“附加库”,然后检查是否确实找到了该库(我主要通过使用 sysinternals 中的 filemon.exe 来完成此操作,然后查找链接.exe 打开 lib 文件。)

经过思考一段时间后,您可能会发现您的图书馆项目将 不是 导出所需的功能。该函数位于数据库库中。您应该将该库添加到您的主项目中。将其添加到静态库项目中是没有用的。

编译器和链接器不会将一个库链接到另一个库(除非一个库是 DLL)。您需要在主项目中指定这两个库(cppsqlite3.lib 和您自己的静态库)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top