unresolved external symbol, but dumpbin says it's ok

前端 未结 1 1060
被撕碎了的回忆
被撕碎了的回忆 2021-01-20 01:53

I downloaded Crypto++ 5.62 and built it with default project settings. In my project I set up the path to cryptopp.lib and defined its name in \"Ad

相关标签:
1条回答
  • 2021-01-20 02:17

    Try adding CRYPTOPP_IMPORTS to your project defines.

    From config.h:

    #ifdef CRYPTOPP_EXPORTS
    # define CRYPTOPP_IS_DLL
    # define CRYPTOPP_DLL __declspec(dllexport)
    #elif defined(CRYPTOPP_IMPORTS)
    # define CRYPTOPP_IS_DLL
    # define CRYPTOPP_DLL __declspec(dllimport)
    #else
    # define CRYPTOPP_DLL
    #endif
    

    Or include Crypto++'s dll.h. It sets CRYPTOPP_IMPORTS:

    #if !defined(CRYPTOPP_IMPORTS) && !defined(CRYPTOPP_EXPORTS) && !defined(CRYPTOPP_DEFAULT_NO_DLL)
    # ifdef CRYPTOPP_CONFIG_H
    #  error To use the DLL version of Crypto++, this file must be included before any other Crypto++ header files.
    # endif
    # define CRYPTOPP_IMPORTS
    #endif
    

    If that does not work...

    g_pAssignIntToInteger is from algparams.cpp:

    $ grep -R g_pAssignIntToInteger *
    algparam.cpp:PAssignIntToInteger g_pAssignIntToInteger = NULL;
    algparam.h:CRYPTOPP_DLL extern PAssignIntToInteger g_pAssignIntToInteger;
    algparam.h:     if (!(g_pAssignIntToInteger != NULL && typeid(T) == typeid(int) && g_pAssignIntToInteger(valueType, pValue, &m_value)))
    integer.cpp:    if (!g_pAssignIntToInteger)
    integer.cpp:        g_pAssignIntToInteger = AssignIntToInteger;
    

    Looking at the declaration in algparam.h:

    // to allow the linker to discard Integer code if not needed.
    typedef bool (CRYPTOPP_API * PAssignIntToInteger)(const std::type_info &valueType, void *pInteger, const void *pInt);
    CRYPTOPP_DLL extern PAssignIntToInteger g_pAssignIntToInteger;
    

    And the implementation in algparam.cpp:

    #ifndef CRYPTOPP_IMPORTS
    ...
    
    NAMESPACE_BEGIN(CryptoPP)    
    PAssignIntToInteger g_pAssignIntToInteger = NULL;
    ...
    

    So you might need to change the implementation to ensure the code uses g_pAssignIntToInteger (to keep it from being discarded). Unfortunately, nothing comes to mind at the moment.


    DEFAULT_CHANNEL is declared in cryptlib.h and has storage allocated in cryptolib.cpp:

    $ grep -R DEFAULT_CHANNEL *
    ...
    cryptlib.cpp:const std::string DEFAULT_CHANNEL;
    ...
    cryptlib.h:extern CRYPTOPP_DLL const std::string DEFAULT_CHANNEL;
    ...
    

    This might be a different problem since I'm not used to seeing issues with DEFAULT_CHANNEL. See how CRYPTOPP_IMPORTS works for you, and then ask a different question since this might be a different problem.

    0 讨论(0)
提交回复
热议问题