如何解决“错误 LNK2019:未解析的外部符号”?[复制]
-
21-08-2019 - |
题
这个问题在这里已经有答案了:
- 什么是未定义的引用/未解析的外部符号错误以及如何修复它? 33 个答案
我正在开发一个 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 库链接到可执行文件,或者直接将源文件包含在项目中。(你做了哪一件事?)
我会按照以下步骤操作:
考虑一下您希望通过哪个库或 .obj 文件导出该符号。
检查是否真的 做 导出该符号(按字符检查)。有时,这是调用约定不同。
检查链接器是否知道您希望包含该符号的库 - 首先检查“附加库”,然后检查是否确实找到了该库(我主要通过使用 sysinternals 中的 filemon.exe 来完成此操作,然后查找链接.exe 打开 lib 文件。)
经过思考一段时间后,您可能会发现您的图书馆项目将 不是 导出所需的功能。该函数位于数据库库中。您应该将该库添加到您的主项目中。将其添加到静态库项目中是没有用的。
编译器和链接器不会将一个库链接到另一个库(除非一个库是 DLL)。您需要在主项目中指定这两个库(cppsqlite3.lib 和您自己的静态库)。