隐式 DLL 链接和类内部函数

Implicit DLL linking and class-internal functions

本文关键字:内部函数 链接 DLL 隐式      更新时间:2023-10-16

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

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

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

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