2017-08-02 44 views
1

Crypto ++ライブラリは、cryptlib.libおよびcryptopp.libに対してコンパイルしてレイトバインディングをサポートしています。これにはcryptopp.dllを使用する必要があります。このDLLを/DELAYLOAD:cryptopp.dllで遅延ロードしようとすると、必要なインポートのためにロードが遅延しないというリンクエラーが発生します。一例として、遅延ロードcrypto ++ 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 *)" ([email protected]@@[email protected]@[email protected])". Link without /DELAYLOAD:cryptopp.dll 

誰もがすでに正常負荷cryptopp.dllを遅らせることに成功しましたか?

答えて

0

The Crypto++ library supports late binding by compiling against cryptlib.lib and cryptopp.lib...

DLLはFIPS DLLです。機能を2つの別々のライブラリに分割する実際の目的は、FIPS 140-2が要求する論理モジュール境界を提供することです。 FIPSモジュールの境界はcryptopp.dllです。

FIPS DLLには、AESやRSAなどのFIPSアルゴリズムしか含まれていません。私はあなたがFIPS DLLを避けることをお勧めします。その痛みと一緒に働く。 Crypto ++ wikiのFIPS DLLも参照してください。

DLLが必要な場合は、独自のAPIを使用して独自のラッパーDLLを作成し、Crypto ++静的ライブラリにリンクします。

ラッパーDLLのケースでは(あなたが経験したように)、cryptest.nmakeを開始点として使用することを強くお勧めします。あなたがmakefileに精通しているなら(私はあなただと思います)、Visual Studio project filesよりも扱いがはるかに簡単です。


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 *)" ([email protected]@@[email protected]@[email protected])". Link without /DELAYLOAD:cryptopp.dll

これは、シンボルがどのライブラリあなたは2つのライブラリを持っているので、興味深い質問で、私にはその明確ではありません。最初のライブラリは、FIPS DLL(cryptopp.dll)であり、それは、 AES、RSAなどです.2番目のライブラリはStatic Lib(cryptlib.lib)で、HexEncoder、FileSource、およびその他のサポートするものが含まれています。

私はg_pAssignIntToIntegerAlgorithmParamtersの一部であったので、静的リブ(cryptlib.lib)に入れるべきだと思います。例えば、Commit 5efb019d8bdc593bを参照してください。ただし、上記のエラーから、シンボル名__imp_?g_pAssignIntToInteger ...のためにFIPS DLLに存在するように見えます。

ここで、しわの追加は、g_pAssignIntToIntegerは関数ポインタであり、コンパイラはそれらを最適化しません。したがって、リンカは決してデカップリングのポイントであるInteger関連シンボルを破棄しません。

Commit 0e55f5ac7d98f3c8g_pAssignIntToIntegerを削除し、定義を追加してCRYPTOPP_NO_ASSIGN_TO_INTEGERとしました。定義によりシンボルとIntegerコードのような不要なコードを破棄することができます。