インターフェイス (すべての純粋仮想関数を含む) がもう 1 つの関数を必要としていて、それを "null" にするのを忘れたときに、同じエラーが発生しました。
私が持っていた
class ICommProvider
{
public:
/**
* @brief If connection is established, it sends the message into the server.
* @param[in] msg - message to be send
* @return 0 if success, error otherwise
*/
virtual int vaSend(const std::string &msg) = 0;
/**
* @brief If connection is established, it is waiting will server response back.
* @param[out] msg is the message received from server
* @return 0 if success, error otherwise
*/
virtual int vaReceive(std::string &msg) = 0;
virtual int vaSendRaw(const char *buff, int bufflen) = 0;
virtual int vaReceiveRaw(char *buff, int bufflen) = 0;
/**
* @bief Closes current connection (if needed) after serving
* @return 0 if success, error otherwise
*/
virtual int vaClose();
};
最後の vaClose は仮想ではないため、コンパイルされたものはそれを実装する場所を知らず、混乱しました。私のメッセージは:
...TCPClient.o:(.rodata+0x38): 「ICommProvider の typeinfo」への未定義の参照
からの簡単な変更
virtual int vaClose();
に
virtual int vaClose() = 0;
問題を修正しました。それが役に立てば幸い