16

我有我正在处理的这个 MFC 应用程序,它需要有一个嵌入式数据库。因此,我为它寻找一个光滑、快速的“可嵌入”数据库,并偶然发现了 SQLite。

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

在库项目中,我创建了一个DBClass带有方法的类AddFeedToDB(CFeed f)。库项目使用.lib来自 codeproject ( 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

我错过了什么?

4

6 回答 6

15

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

于 2011-06-28T12:39:00.093 回答
9

在我身上不止一次发生过,我认为符号XXX(ie ?close@CppSQLite3DB@@QAEXXZ)导入库中,而实际符号是__impXXX(ie __imp?close@CppSQLite3DB@@QAEXXZ)。

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

于 2009-05-12T19:37:06.113 回答
4

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

于 2011-05-05T08:38:59.297 回答
1

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

于 2009-05-12T19:41:32.817 回答
1

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

于 2009-05-11T18:02:17.667 回答
1

我会按照以下步骤操作:

  1. 考虑一下您希望导出符号的库或 .obj 文件。

  2. 检查它是否确实导出了那个符号(检查字符)。有时,调用约定不同。

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

想了想,你可能会发现你的库项目并不会导出所寻找的函数。该函数位于数据库库中。您应该将该库添加到您的主项目中。将它添加到您的静态库项目中是没有用的。

于 2009-05-11T20:02:42.493 回答