如何解决“错误LNK2019:未解析的外部符号”?

时间:2009-05-11 17:51:43

标签: c++ visual-c++ linker static-libraries

我有一个我正在研究的MFC应用程序需要有一个嵌入式数据库。所以我去寻找一个灵活,快速的“可嵌入”数据库,并且偶然发现了SQLite。

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

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

我错过了什么?

6 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:9)

我不止一次地想到,我认为导入库中的符号XXX(即?close@CppSQLite3DB@@QAEXXZ,而实际的符号是__impXXX (即__imp?close@CppSQLite3DB@@QAEXXZ)。

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

答案 2 :(得分:5)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

我会按照以下步骤操作:

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

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

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

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

答案 5 :(得分:1)

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