Библиотека Crypto ++ поддерживает позднее связывание путем компиляции cryptlib.lib
а также cryptopp.lib
, Это требует использования cryptopp.dll
, При попытке отложить загрузку этой DLL /DELAYLOAD:cryptopp.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
успешно?
Библиотека Crypto ++ поддерживает позднее связывание путем компиляции с cryptlib.lib и cryptopp.lib …
DLL является библиотекой FIPS. Фактическая цель разделения функциональности на две отдельные библиотеки — предоставить границу логического модуля, требуемую FIPS 140-2. Граница модуля FIPS cryptopp.dll
,
DLL FIPS включает в себя только алгоритмы FIPS, такие как AES и RSA. Я рекомендую вам избегать FIPS DLL любой ценой. С болью работать. Также см FIPS DLL на Crypto ++ вики.
Если вам нужна DLL, то напишите свою собственную DLL-оболочку со своим собственным API, а затем создайте ссылку на статическую библиотеку Crypto ++.
В случае оболочки DLL (и так как вы, кажется, опытный), я настоятельно рекомендую вам использовать cryptest.nmake
в качестве отправной точки. Если вы знакомы с make-файлами (я так думаю), то вам будет гораздо проще работать с ними, чем Файлы проекта Visual Studio.
ССЫЛКА: фатальная ошибка LNK1194: задержка загрузки «cryptopp.dll» невозможна из-за импорта символа данных «» __declspec (dllimport) bool (__cdecl * CryptoPP :: g_pAssignIntToInteger) (класс type_info const &, void *, void const *) «(__imp_? g_pAssignIntToInteger @ CryptoPP @@ 3P6A_NABVtype_info @@ PAXPBX @ ZA)». Ссылка без /DELAYLOAD:cryptopp.dll
Это интересный вопрос, потому что у вас есть две библиотеки, и мне не ясно, в какой библиотеке находится символ. Первая библиотека — это FIPS DLL (cryptopp.dll), и она включает в себя AES, RSA и т. Д. Вторая библиотека Static Lib (cryptlib.lib) и включает в себя HexEncoder, FileSource и другие вспомогательные средства.
я верю g_pAssignIntToInteger
должен быть в Static Lib (cryptlib.lib), потому что он был частью AlgorithmParamters
, Смотрите, например, Совершить 5efb019d8bdc593b. Тем не менее, из вышеприведенной ошибки, кажется, находится в DLL FIPS из-за имени символа __imp_?g_pAssignIntToInteger ...
,
Теперь добавлена морщина, g_pAssignIntToInteger
является указателем на функцию, и компиляторы не будут их оптимизировать. Так что компоновщик никогда не сбрасывает Integer
связанные символы, который является точкой развязки.
В Совершить 0e55f5ac7d98f3c8 мы удалили g_pAssignIntToInteger
и добавил определение CRYPTOPP_NO_ASSIGN_TO_INTEGER
выполнить задачу. Определение обеспечивает символ и нежелательный код, такой как Integer
код может быть отброшен.
Других решений пока нет …