我正在尝试链接一个带有头文件的dll。由于没有可用的* .lib文件,我通过手动创建* .def文件(Ref)
制作了一个现在的问题是,我的测试程序是__cdecl
,而dll中的方法是__stdcall
。动态链接特定方法时,是否有办法强制使用__stdcall
?
尽管它不是一个选项,但尝试将调用约定(/Gd
)更改为/Gz
,但是出现了名称错误的现象,表明链接器无法找到如下所示的稍微错误的方法。
LNK2019 unresolved external symbol _TSTInitialize@24 referenced in function
头文件中的功能签名是,
#define TSTPERC_API /*__declspec( dllimport ) __stdcall */
TSTHandle cOpts;
//call native methods
TSTFunctionResult cResult = ::TSTInitialize(
p_strPathToLib.c_str(), p_strConfigStruct.c_str(), p_strLic.c_str(),
p_strRFU1.c_str(), p_strRFU2.c_str(), &cOpts );
好,对于具有错误的[[。def或错误的[[.lib文件的方法,不要强加stdcall
。
@24
在这种情况下是被调用方需要清除的堆栈上的字节。因此,无法将其剥离(如果您这样做,那么被调用者将无法知道要从堆栈中清除多少字节!)。 真正的问题是我创建的* .def文件。在我对@ hans-passant的评论中,语法是另一种方式,TSTInitialize@24=TSTInitialize
这将在lib文件_TSTInitialize@24
中寻找正确的导出符号,linker
。这有助于将程序还原为使用/Gd
而不是/Gz