0

我正在尝试为 SQLite 编写一个包装类,以便使用隐式链接通过 DLL 公开,即生成库和头文件供消费者编译和链接。

目前我正在导出包装类,但是当我尝试编译使用这个包装类的项目时,我收到关于无法解析 sqlite API 调用的链接器错误,例如 sqlite3_open。包装类和消费者都是 C++,但 sqlite 是 C。

为什么消费者需要知道没有暴露给它的函数(包装类的全部要点)?这是否意味着我需要修改 SQLite 标头以更改其函数以对所有函数/我要包装的函数进行适当的 _declspec(dllexport) 装饰?这种变化有替代方案吗?

链接器错误:

libsqlite.lib(sqlitewrapper.oxl) : error LNK2019: unresolved external symbol _sq
lite3_close referenced in function "public: virtual __thiscall CSQLiteWrapper::~
CSQLiteWrapper(void)" (??1CSQLiteWrapper@@UAE@XZ)

libsqlite.lib(sqlitewrapper.oxl) : error LNK2019: unresolved external symbol _sq
lite3_open referenced in function "public: __thiscall CSQLiteWrapper::CSQLiteWra
pper(class ATL::CStringT<char,class ATL::StrTraitATL<char,class ATL::ChTraitsCRT
<char> > > const &)" (??0CSQLiteWrapper@@QAE@ABV?$CStringT@DV?$StrTraitATL@DV?$C
hTraitsCRT@D@ATL@@@ATL@@@ATL@@@Z)

libsqlite.lib(sqlitewrapper.oxl) : error LNK2019: unresolved external symbol _sq
lite3_free referenced in function "public: virtual void __thiscall CSQLiteWrappe
r::Exec(class ATL::CStringT<char,class ATL::StrTraitATL<char,class ATL::ChTraits
CRT<char> > > const &,int (__cdecl*)(void *,int,char * *,char * *))" (?Exec@CSQL
iteWrapper@@UAEXABV?$CStringT@DV?$StrTraitATL@DV?$ChTraitsCRT@D@ATL@@@ATL@@@ATL@
@P6AHPAXHPAPAD2@Z@Z)

libsqlite.lib(sqlitewrapper.oxl) : error LNK2019: unresolved external symbol _sq
lite3_exec referenced in function "public: virtual void __thiscall CSQLiteWrappe
r::Exec(class ATL::CStringT<char,class ATL::StrTraitATL<char,class ATL::ChTraits
CRT<char> > > const &,int (__cdecl*)(void *,int,char * *,char * *))" (?Exec@CSQL
iteWrapper@@UAEXABV?$CStringT@DV?$StrTraitATL@DV?$ChTraitsCRT@D@ATL@@@ATL@@@ATL@
@P6AHPAXHPAPAD2@Z@Z)
4

2 回答 2

2

您是否将包装器静态链接到 SQLite 库?这样做应该意味着一切都存在于您的库中,而不仅仅是一个网关,因此链接器错误应该消失。那是假设您当然不想将 SQLite 库与包装器分开。

于 2012-05-16T03:43:28.270 回答
1

我的问题的根本原因是我使用“lib”命令来生成我然后链接的库。正如 Ixop 所提到的,在这种情况下,我需要确保将 SQLite 添加到我的库中,即使它没有直接暴露在 DLL 中。

然而,对于隐式链接,我应该做的是使用IMPLIB链接器指令来生成库。对我构建它的方式进行更改解决了这个问题。

于 2012-05-16T22:51:47.710 回答