隐式DLL链接和类内部函数

时间:2012-05-16 02:00:03

标签: c++ dll linker

我正在尝试为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)

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

然而,通过隐式链接,我应该做的是使用IMPLIB链接器指令来生成库。对我的构建方式进行此更改可以解决问题。