C++ C++;未定义的符号:从共享库返回的NullPointerException错误

C++ C++;未定义的符号:从共享库返回的NullPointerException错误,c++,C++,我的代码有一些问题。共享库导致了一个我无法理解的未定义符号错误。所有文件都位于正确的位置,共享库成功构建,但在执行程序时返回以下消息 错误消息: libsp.so: undefined symbol: _ZTIN4Poco20NullPointerExceptionE 从我所看到的问题是我使用的Poco头。我从外部源获得的头文件应该都能工作,我相信错误是由我如何调用这些头文件引起的,但我可能错了 Bellow是libsp库中唯一使用Poco的代码。以及我使用的4个头文件的代码。我已经检查并重新

我的代码有一些问题。共享库导致了一个我无法理解的未定义符号错误。所有文件都位于正确的位置,共享库成功构建,但在执行程序时返回以下消息

错误消息:

libsp.so: undefined symbol: _ZTIN4Poco20NullPointerExceptionE
从我所看到的问题是我使用的Poco头。我从外部源获得的头文件应该都能工作,我相信错误是由我如何调用这些头文件引起的,但我可能错了

Bellow是libsp库中唯一使用Poco的代码。以及我使用的4个头文件的代码。我已经检查并重新检查,没有发现任何问题,但仍然得到未定义的符号异常

文件Spexec.cpp(libsp):

#include "../poco/Poco/Base64Encoder.h"
#include "../poco/Poco/DigestEngine.h"
#include "../poco/Poco/MD5Engine.h"
#include "../poco/Poco/Path.h"

using namespace std;

stringstream s_base;
Poco::Base64Encoder encoder(s_base);

Poco::Path path(data.name);
data.path = data.name.substr(0, data.name.length() - path.getFileName().length());

    Poco::MD5Engine md5;
    stringstream ss;

    ss << data.created << data.name;
    md5.update(ss.str());
    data.name = Poco::DigestEngine::digestToHex(md5.digest());
}
#ifndef Foundation_Base64Encoder_INCLUDED
#define Foundation_Base64Encoder_INCLUDED
#include "Foundation.h"
#include <ostream>

namespace Poco {

class Foundation_API Base64Encoder:, public std::ostream
{
public:
    Base64Encoder(std::ostream& ostr);
    ~Base64Encoder();

private:
    Base64Encoder(const Base64Encoder&);
    Base64Encoder& operator = (const Base64Encoder&);
};
} // namespace Poco

#endif // Foundation_Base64Encoder_INCLUDED
#ifndef Foundation_DigestEngine_INCLUDED
#define Foundation_DigestEngine_INCLUDED
#include "Foundation.h"
#include <vector>

namespace Poco {

class Foundation_API DigestEngine
{
public:
    typedef std::vector<unsigned char> Digest;

    DigestEngine();
    virtual ~DigestEngine();

    void update(const void* data, std::size_t length);
    void update(char data);
    void update(const std::string& data);
    virtual std::size_t digestLength() const = 0;
    virtual void reset() = 0;       
    virtual const Digest& digest() = 0;
    static std::string digestToHex(const Digest& bytes);
    static Digest digestFromHex(const std::string& digest);

presentation

protected:
    virtual void updateImpl(const void* data, std::size_t length) = 0;
private:
    DigestEngine(const DigestEngine&);
    DigestEngine& operator = (const DigestEngine&);
};
#ifndef Foundation_MD5Engine_INCLUDED
#define Foundation_MD5Engine_INCLUDED
#include "Foundation.h"
#include "DigestEngine.h"

namespace Poco {

class Foundation_API MD5Engine: public DigestEngine
{
public:
    enum
    {
        BLOCK_SIZE  = 64,
        DIGEST_SIZE = 16
    };

    MD5Engine();
    ~MD5Engine();

    std::size_t digestLength() const;
    void reset();
    const DigestEngine::Digest& digest();

protected:
    void updateImpl(const void* data, std::size_t length);

private:
    static void transform(UInt32 state[4], const unsigned char block[64]);
    static void encode(unsigned char* output, const UInt32* input, std::size_t len);
    static void decode(UInt32* output, const unsigned char* input, std::size_t len);

    struct Context
    {
        UInt32 state[4];          // state (ABCD)
        UInt32 count[2];          // number of bits, modulo 2^64 (lsb first)
        unsigned char buffer[64]; // input buffer
    };
    Context _context;
    DigestEngine::Digest _digest;
    MD5Engine(const MD5Engine&);
    MD5Engine& operator = (const MD5Engine&);
};
}
#ifndef Foundation_Path_INCLUDED
#define Foundation_Path_INCLUDED
#include "Foundation.h"
#include <vector>

namespace Poco {

class Foundation_API Path
{
public:
    enum Style
    {
        PATH_UNIX,    /// Unix-style path
        PATH_WINDOWS, /// Windows-style path
        PATH_VMS,     /// VMS-style path
        PATH_NATIVE,  /// The current platform's native style
        PATH_GUESS    /// Guess the style by examining the path
    };
    typedef std::vector<std::string> StringVec;
    Path();   
    Path(const char* path);
    Path(const std::string& path);

protected:
    void parseUnix(const std::string& path);
    void parseWindows(const std::string& path);
    void parseVMS(const std::string& path);
    void parseGuess(const std::string& path);
    std::string buildUnix() const;
    std::string buildWindows() const;
    std::string buildVMS() const;

private:
    std::string _node;
    std::string _device;
    std::string _name;
    std::string _version;
    StringVec   _dirs;
    bool        _absolute;
};
文件路径.h:

#include "../poco/Poco/Base64Encoder.h"
#include "../poco/Poco/DigestEngine.h"
#include "../poco/Poco/MD5Engine.h"
#include "../poco/Poco/Path.h"

using namespace std;

stringstream s_base;
Poco::Base64Encoder encoder(s_base);

Poco::Path path(data.name);
data.path = data.name.substr(0, data.name.length() - path.getFileName().length());

    Poco::MD5Engine md5;
    stringstream ss;

    ss << data.created << data.name;
    md5.update(ss.str());
    data.name = Poco::DigestEngine::digestToHex(md5.digest());
}
#ifndef Foundation_Base64Encoder_INCLUDED
#define Foundation_Base64Encoder_INCLUDED
#include "Foundation.h"
#include <ostream>

namespace Poco {

class Foundation_API Base64Encoder:, public std::ostream
{
public:
    Base64Encoder(std::ostream& ostr);
    ~Base64Encoder();

private:
    Base64Encoder(const Base64Encoder&);
    Base64Encoder& operator = (const Base64Encoder&);
};
} // namespace Poco

#endif // Foundation_Base64Encoder_INCLUDED
#ifndef Foundation_DigestEngine_INCLUDED
#define Foundation_DigestEngine_INCLUDED
#include "Foundation.h"
#include <vector>

namespace Poco {

class Foundation_API DigestEngine
{
public:
    typedef std::vector<unsigned char> Digest;

    DigestEngine();
    virtual ~DigestEngine();

    void update(const void* data, std::size_t length);
    void update(char data);
    void update(const std::string& data);
    virtual std::size_t digestLength() const = 0;
    virtual void reset() = 0;       
    virtual const Digest& digest() = 0;
    static std::string digestToHex(const Digest& bytes);
    static Digest digestFromHex(const std::string& digest);

presentation

protected:
    virtual void updateImpl(const void* data, std::size_t length) = 0;
private:
    DigestEngine(const DigestEngine&);
    DigestEngine& operator = (const DigestEngine&);
};
#ifndef Foundation_MD5Engine_INCLUDED
#define Foundation_MD5Engine_INCLUDED
#include "Foundation.h"
#include "DigestEngine.h"

namespace Poco {

class Foundation_API MD5Engine: public DigestEngine
{
public:
    enum
    {
        BLOCK_SIZE  = 64,
        DIGEST_SIZE = 16
    };

    MD5Engine();
    ~MD5Engine();

    std::size_t digestLength() const;
    void reset();
    const DigestEngine::Digest& digest();

protected:
    void updateImpl(const void* data, std::size_t length);

private:
    static void transform(UInt32 state[4], const unsigned char block[64]);
    static void encode(unsigned char* output, const UInt32* input, std::size_t len);
    static void decode(UInt32* output, const unsigned char* input, std::size_t len);

    struct Context
    {
        UInt32 state[4];          // state (ABCD)
        UInt32 count[2];          // number of bits, modulo 2^64 (lsb first)
        unsigned char buffer[64]; // input buffer
    };
    Context _context;
    DigestEngine::Digest _digest;
    MD5Engine(const MD5Engine&);
    MD5Engine& operator = (const MD5Engine&);
};
}
#ifndef Foundation_Path_INCLUDED
#define Foundation_Path_INCLUDED
#include "Foundation.h"
#include <vector>

namespace Poco {

class Foundation_API Path
{
public:
    enum Style
    {
        PATH_UNIX,    /// Unix-style path
        PATH_WINDOWS, /// Windows-style path
        PATH_VMS,     /// VMS-style path
        PATH_NATIVE,  /// The current platform's native style
        PATH_GUESS    /// Guess the style by examining the path
    };
    typedef std::vector<std::string> StringVec;
    Path();   
    Path(const char* path);
    Path(const std::string& path);

protected:
    void parseUnix(const std::string& path);
    void parseWindows(const std::string& path);
    void parseVMS(const std::string& path);
    void parseGuess(const std::string& path);
    std::string buildUnix() const;
    std::string buildWindows() const;
    std::string buildVMS() const;

private:
    std::string _node;
    std::string _device;
    std::string _name;
    std::string _version;
    StringVec   _dirs;
    bool        _absolute;
};
#包含ifndef基金会路径#
#定义包含的基础路径
#包括“Foundation.h”
#包括
名称空间Poco{
类基础\u API路径
{
公众:
枚举样式
{
路径_UNIX,///UNIX风格的路径
路径\u WINDOWS,///WINDOWS样式路径
路径_VMS,///VMS样式的路径
PATH_NATIVE,///当前平台的本机样式
PATH\u GUESS///通过检查路径来猜测样式
};
typedef std::vector StringVec;
路径();
路径(常量字符*路径);
路径(const std::字符串和路径);
受保护的:
void parseUnix(const std::string和path);
void parseWindows(const std::string和path);
void parseVMS(const std::string和path);
void parseGuess(const std::string和path);
std::string buildUnix()常量;
std::string buildWindows()常量;
std::string buildVMS()常量;
私人:
std::string\u节点;
std::string\u设备;
std::string _name;
std::string\u版本;
StringVec_dirs;
绝对布尔;
};

这是链接器错误。您未链接Poco库(libPocoFoundationd.so)好的,首先谢谢你的回答,一个问题是你怎么知道它是这个libPocoFoundationd.so库的?我的意思是你是从代码的某个地方看到的还是…?这是从'Foundation_API'和'strings libPocoFoundationd.so | grep NullPointerException'中猜出来的。仅供参考缺少的符号是
Poco::NullPointerException的typeinfo节点。看起来好像找不到标准的C++库?(DeangLED,它是代码> STD::yxCXX11::Basic StrugBuf)