通过针对cryptlib.lib和cryptopp.lib进行编译,Crypto++库支持后期绑定。这需要使用cryptopp.dll。当尝试通过/DELAYLOAD:cryptopp.dll延迟加载此dll时,这会导致由于需要的导入而无法延迟加载此dll的链接错误。
例如,请参阅以下代码:
#include <Crypto++/dll.h>
#include <crypto++/base64.h>
bool HexDecode(const std::string& strHex, std::string& strData)
{
try
{
CryptoPP::StringSource(strHex, true,
new CryptoPP::Base64Decoder(
new CryptoPP::StringSink(strData)));
}
catch(...)
{
return false;
}
return true;
}这会导致以下链接错误:
LINK : fatal error LNK1194: Delay loading "cryptopp.dll" not possible because of import of data symbol ""__declspec(dllimport) bool (__cdecl* CryptoPP::g_pAssignIntToInteger)(class type_info const &,void *,void const *)" (__imp_?g_pAssignIntToInteger@CryptoPP@@3P6A_NABVtype_info@@PAXPBX@ZA)". Link without /DELAYLOAD:cryptopp.dll有没有人已经成功地延迟加载cryptopp.dll了?
发布于 2017-08-03 19:27:03
Crypto++库通过针对cryptlib.lib和cryptopp.lib进行编译来支持后期绑定...
DLL是FIPS DLL。将功能拆分为两个单独的库的实际目的是提供FIPS 140-2所需的逻辑模块边界。FIPS模块边界为cryptopp.dll。
FIPS DLL仅包括FIPS算法,如AES和RSA。我建议您不惜一切代价避免使用FIPS DLL。与之共事是一种痛苦。另请参阅Crypto++维基上的FIPS DLL。
如果需要动态链接库,则使用自己的API编写自己的包装器动态链接库,然后链接到Crypto++静态库。
在包装器DLL的情况下(因为您看起来很有经验),我强烈建议您使用cryptest.nmake作为起点。如果您熟悉makefile(我认为您熟悉),那么您会发现使用它比使用Visual Studio project files容易得多。
链接:致命错误LNK1194:由于导入数据符号“”cryptopp.dll(__declspec(Dllimport) bool (__cdecl* CryptoPP::g_pAssignIntToInteger)( type_info const &,__declspec *,void const *))“LNK1194,无法延迟加载"cryptopp.dll”不带/DELAYLOAD:cryptopp.dll的链接
这是一个有趣的问题,因为你有两个库,而我不清楚符号在哪个库中。第一个库是FIPS DLL (cryptopp.dll),它包括AES、RSA等。第二个库是Static Lib (cryptlib.lib),它包括HexEncoder、FileSource和其他支持工具。
我认为g_pAssignIntToInteger应该在静态库(cryptlib.lib)中,因为它是AlgorithmParamters的一部分。例如,请参见Commit 5efb019d8bdc593b。但是,从上面的错误中可以看出,由于符号名称__imp_?g_pAssignIntToInteger ...,它似乎驻留在FIPS DLL中。
现在增加的问题是,g_pAssignIntToInteger是一个函数指针,编译器不会优化它们。因此,链接器永远不会丢弃与Integer相关的符号,这就是解耦的要点。
在Commit 0e55f5ac7d98f3c8中,我们删除了g_pAssignIntToInteger,并添加了一个定义CRYPTOPP_NO_ASSIGN_TO_INTEGER来完成任务。定义确保符号和不需要的代码(如Integer代码)可以被丢弃。
https://stackoverflow.com/questions/45462728
复制相似问题