【问题标题】:How can I resolve "error LNK2019: unresolved external symbol"? [duplicate]如何解决“错误 LNK2019:未解析的外部符号”? [复制]
【发布时间】:2010-10-25 08:32:02
【问题描述】:

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

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

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

我错过了什么?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 太好了,感谢您的好回答,链接器错误是由于依赖关系
    【解决方案2】:

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

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

    【讨论】:

    • 这能回答给定的问题吗?
    • @ST3:显然,它解决了这个特殊情况。如果这就是您的意思,这不是解决链接器错误的通用方法。
    • 是的,添加这一行也解决了我的(类似)问题。实际发生的是,某些项目需要在另一个未导出的 dll 中定义的符号(通常是 MSVS)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 在库项目中,我去了项目->属性->配置属性->图书馆员->常规->附加依赖项,并添加了“..\SQLiteCommon\sqlite3.lib”。
      • 您是否静态链接它(编译时)?
      • 是的,我认为是静态链接的。但奇怪的是,与其他项目类型一样,我在项目属性->配置属性中看不到链接器选项卡,但我看到的是 Librarian。
      【解决方案5】:

      我会遵循以下步骤:

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

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

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

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

      【讨论】:

      • lib(sqlite.lib) 确实导出了符号。我将lib添加到我的主项目中,但它仍然不起作用。我仍然遇到同样的错误。
      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 2012-10-31
        • 2012-08-31
        • 1970-01-01
        • 2014-05-12
        相关资源
        最近更新 更多