繁体   English   中英

C ++ / CLI中奇怪的未解析外部符号

[英]Strange Unresolved External Symbol in C++/CLI

我有一个LNK2001错误,我无法解决!
我的解决方案由一个本机项目(DLL)和一个托管项目(DLL包装器)组成。
如果与本机测试应用程序一起使用,本机DLL将起作用。
现在,本机代码如下(全部定义在名称空间EuroSDK :: Protocols中):

EUROSDK_API定义为__declspec(dllexport)

IMessageDispatcher.h

class EUROSDK_API IMessageDispatcher {
  public:

    IMessageDispatcher() : m_ProtocolAdapter(0) {};

    virtual ~IMessageDispatcher() {};

    virtual ERROR_CODE SendMessage(IMessage & msg) = 0;

    virtual ERROR_CODE SendMessage(IMessage & msg, STRING destination) { 
      RAISE_AND_RETURN(EC_NOT_IMPLEMENTED); 
    };

    virtual ERROR_CODE SendMessageSync(IMessage & msg) { 
      RAISE_AND_RETURN(EC_NOT_IMPLEMENTED);
    };

    virtual ERROR_CODE SendMessageSync(IMessage & msg, IMessage & ret_msg) { 
      RAISE_AND_RETURN(EC_NOT_IMPLEMENTED); 
    };

    virtual ERROR_CODE SendMessageRaw(char* buff, UINT size) { 
      RAISE_AND_RETURN(EC_NOT_IMPLEMENTED); 
    };

    ERROR_CODE SetProtocolAdapter(IProtocolAdapter * adapter) {
      m_ProtocolAdapter = adapter;
      return EC_NO_ERRORS;
    }

  protected:
    IProtocolAdapter*   m_ProtocolAdapter;
};


class EUROSDK_API INetMessageDispatcher : public IMessageDispatcher {
  public:

    virtual ERROR_CODE Init(STRING  stationName, 
                            STRING  userName, 
                            BOOL    crypthData = FALSE) = 0;

    virtual ERROR_CODE Connect(UINT   portNumber, 
                               STRING remoteIP, 
                               UINT   connectionTimeOut = 5000) = 0;

    virtual ERROR_CODE Disconnect() = 0;
};

NetMessageDispatcher.h

class EUROSDK_API NetMessageDispatcher : public INetMessageDispatcher
{
  ...      
  ERROR_CODE  SendMessage(IMessage & msg);
  ERROR_CODE  SendMessage(IMessage & msg, STRING destination);    
  ...
};

NetMessageDispatcher.cpp

  ERROR_CODE  NetMessageDispatcher::SendMessage(IMessage & msg) {
     ... implementation ...
  }
  ERROR_CODE  NetMessageDispatcher::SendMessage(IMessage & msg, STRING destination) {
     ... implementation ...      
  }

现在,进入托管包装器中:

NetMessageDispatcherNET.h

using namespace EurocSDK::Protocols;

namespace EuroSDKNET {
  namespace Protocols {

    class NetMessageDispatcherWrap;

    public ref class NetMessageDispatcherNET {
      public:

        NetMessageDispatcherNET(EDispatcherType stationType, 
                                MessageEventHandlerNET^ handler)

        ~NetMessageDispatcherNET() {};

        // Implemented in the cpp file
        virtual int  SendMessage(IMessageNET^ msg);
        virtual int  SendMessage(IMessageNET^ msg, String^ destination);

        private:
        CAutoNativePtr<NetMessageDispatcherWrap> m_Dispatcher;
    };

    // Unmanaged Wrapper
    private class NetMessageDispatcherWrap : public ISessionFactory, 
                                             public NetMessageDispatcher {
      public:
        ~NetMessageDispatcherWrap() {}
        NetMessageDispatcherWrap(MessageEventHandlerNET^  handler,
                                 NetMessageDispatcherNET^ dispatcher,
                                 IMessageFactory::Ptr     messageFactory,                                 
                                 EuroSDKNET::Protocols::EDispatcherType stationType) : 
            NetMessageDispatcher(this, 
                                 messageFactory, 
                                 Logger::get("NetMessageDispatcher"), 
                                 (EuroSDK::Protocols::EDispatcherType)stationType),
            m_handler(handler),
            m_Dispatcher(dispatcher) {}

        /// Creates an instance of a Session,
        /// using the given message handler.
        inline Session* createSession(const IMessageDispatcher* dispatcher) {
          ..... implementation ....
        }

      private:
        gcroot<MessageEventHandlerNET^>   m_handler;
        gcroot<NetMessageDispatcherNET^>  m_Dispatcher;
    };    

  }
}

NetMessageDispatcherNET.cpp

NetMessageDispatcherNET::NetMessageDispatcherNET(EuroSDKNET::Protocols::EDispatcherType stationType, 
                                                 MessageEventHandlerNET^ handler) {

  m_Dispatcher = new NetMessageDispatcherWrap(handler,
                                              this,
                                              new EuroSDK::Protocols::PBMessageFactory(), 
                                              stationType);
}

NetMessageDispatcherNET::~NetMessageDispatcherNET() {}

int  NetMessageDispatcherNET::SendMessage(IMessageNET^ msg) {
  return 0;
}

int  NetMessageDispatcherNET::SendMessage(IMessageNET^ msg, String^ destination) {
  return 0;
}

现在,当我构建NET DLL时,我得到:

1>NetMessageDispatcher.obj : warning LNK4248: unresolved typeref token (01000017) for 'boost.detail.win32._SECURITY_ATTRIBUTES'; image may not run
1>NetMessageDispatcherWrapper.obj : error LNK2001: unresolved external symbol "public: virtual enum E_ErrorCode __thiscall EuroSDK::Protocols::NetMessageDispatcher::SendMessage(class EuroSDK::Protocols::IMessage &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?SendMessage@NetMessageDispatcher@Protocols@EuroSDK@@UAE?AW4E_ErrorCode@@AAVIMessage@23@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>NetMessageDispatcherWrapper.obj : error LNK2001: unresolved external symbol "public: virtual enum E_ErrorCode __thiscall EuroSDK::Protocols::NetMessageDispatcher::SendMessage(class EuroSDK::Protocols::IMessage &)" (?SendMessage@NetMessageDispatcher@Protocols@EuroSDK@@UAE?AW4E_ErrorCode@@AAVIMessage@23@@Z)

是什么原因引起的?

丹妮尔

根据您的新评论和修改

在您定义的IMessageDispatcher类中

 virtual ERROR_CODE SendMessage(IMessage & msg) = 0;

 virtual ERROR_CODE SendMessage(IMessage & msg, STRING destination) { 
      RAISE_AND_RETURN(EC_NOT_IMPLEMENTED); 
    };

现在, INetMessageDispatcher从IMessageDispatcher继承了这两个函数,这意味着在实现纯虚拟函数后,可以在INetMessageDispatcher实例上调用它们。

接下来, NetMessageDispatcherINetMessageDispatcher继承了这两个函数,这是重新定义的,因此您的解决方案是

1)从NetMessageDispatcher类中删除重定义,它们是不必要的

2)如果使用C ++ 11,则可以使用override关键字

class EUROSDK_API NetMessageDispatcher : public INetMessageDispatcher
{
  ...      
  virtual ERROR_CODE SendMessage(IMessage & msg) override;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM