为什么我会收到符号查找错误?

时间:2009-07-13 11:16:18

标签: c++

我正在编写一个库,它使用dlsym在我的主应用程序中动态加载。 我有以下文件:

library.h

#include <ilibrary.h>
#include <igateway.h>

class LibraryImpl;

class Library: public ILibrary {
public:
    static ILibrary* instance();

    IGateway* getGateway() const;

protected:
    Library();
    virtual ~Library();

private:
    static ILibrary* instance_;
    LibraryImpl* library_;
};

extern "C" {
    IMPORT_EXPORT ILibrary* getLibrary();
}

library.cpp

#include "library.h"

#include "business/BCGateway.h"


class LibraryImpl {
public:
    IGateway* getGateway();
};

IGateway* LibraryImpl::getGateway() {
    return BCGateway::instance();
}



ILibrary* Library::instance_ = NULL;
ILibrary* Library::instance() {
    return instance_ ? instance_ : (instance_ = new Library);
}

Library::Library() {
    library_ = new LibraryImpl();
}

Library::~Library() {
    delete library_;
}

IGateway* Library::getGateway() const {
    return library_->getGateway();
}


extern "C" {
    IMPORT_EXPORT
    ILibrary* getLibrary(){
        return Library::instance();
    }
}

业务/ BCGateway.h

#include <igateway.h>

class BCGateway: public IGateway {
public:
    static IGateway* instance();

protected:
    BCGateway();

private:
    static IGateway* instance_;
};

业务/ BCGateway.cpp

#include "BCGateway.h"

IGateway* BCGateway::instance_ = NULL;
IGateway* BCGateway::instance(){
    return instance_ ? instance_ : (instance_ = new BCGateway);
}

我可以连接到库并成功加载Library-instance。但是当我在我的主应用程序中调用library-&gt; getGateway()时,我收到以下错误:

  

符号查找错误:./ gateways / libSwisscomXtraZone.so:未定义的符号:_ZN9BCGateway8instanceEv

请你给我一个提示,我该如何解决这个问题?我被卡住了。

感谢。

2 个答案:

答案 0 :(得分:9)

我把错误放在c++filt之间,它说错误的名字代表

BCGateway::instance()

这表示您在某个地方拨打BCGateway::instance()并忘记链接BCGateway.o,或者您甚至忘记定义BCGateway::instance()

答案 1 :(得分:1)

所有静态成员必须在cpp文件中初始化。看到BCGateway :: instance在任何时候都没有初始化,它将无法找到符号。但问题是,如果您创建BCGateway.cpp并初始化实例,那么您最终只会有一个实例,可能是多个进程。这可能是也可能不是问题,具体取决于您使用DLL的方式。