我有一个我正在研究的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
我错过了什么?
答案 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)
我会按照以下步骤操作:
考虑您希望导出符号的库或.obj文件。
检查它是否 导出该符号(检查字符)。有时,调用约定不同。
检查链接器是否知道您希望包含该符号的库 - 首先检查“其他库”,然后检查是否实际找到了库(我主要通过使用filemon.exe来执行此操作) sysinternals,并查找link.exe以打开lib文件。)
经过一段时间的思考,您可能会发现您的图书馆项目不导出所寻求的功能。该函数位于数据库lib中。您应该将该lib添加到主项目中。将它添加到静态lib项目中是没有用的。
答案 5 :(得分:1)
编译器和链接器不会将一个库链接到另一个库(除非一个是DLL)。您需要在主项目中指定两个库(cppsqlite3.lib和您自己的静态库)。