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

How can I resolve “error LNK2019: unresolved external symbol”?

本问题已经有最佳答案,请猛点这里访问。

我有一个我正在开发的MFC应用程序,需要有一个嵌入式数据库。所以我去寻找一个光滑、快速的"可嵌入"数据库,然后偶然发现了AccrossSQLite。

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

在库项目中,我用方法AddFeedToDB(CFeed f)创建了一个类DBClass。库项目使用来自codeproject(cppsqlite3.lib.lib文件。

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

1
2
3
4
5
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

我错过了什么?


我知道这个问题已经过去两年了…但我在这里也遇到了同样的情况。添加了所有头文件…添加了lib目录..继续犯这个错误。因此,我手动将lib添加到配置属性->链接器->输入->附加依赖项中。一切都为我工作。


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

链接器错误的原因将在编译步骤中找到:编译器将生成要导入的?close@CppSQLite3DB@@QAEXXZ符号,并在其中生成__imp?close@CppSQLite3DB@@QAEXXZ。这通常意味着函数声明本身没有__declspec( dllimport )。这可能是由于某些预处理器符号未被定义造成的。或者说江户一〔7〕根本不在那里…


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


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


我将遵循以下步骤:

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

  • 检查它是否真的导出了那个符号(检查字符)。有时,这是呼叫约定的不同。

  • 检查您希望包含符号的库是否为链接器已知-首先检查"附加库",然后检查是否确实找到了该库(我主要通过使用SysInternals中的filemon.exe来执行此操作,并查找link.exe以打开lib文件)。

  • 经过一段时间的思考,您可能会发现您的库项目不会导出所需的函数。该函数在数据库库中。您应该将该lib添加到主项目中。将它添加到静态lib项目中是没有用的。


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