2009-07-13 53 views
6

Tôi đang viết một thư viện, được tải động trong ứng dụng chính của tôi với dlsym. Tôi có những file sau:Tại sao tôi nhận được lỗi tra cứu ký hiệu?

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(); 
    } 
} 

kinh doanh/BCGateway.h

#include <igateway.h> 

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

protected: 
    BCGateway(); 

private: 
    static IGateway* instance_; 
}; 

kinh doanh/BCGateway.cpp

#include "BCGateway.h" 

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

Tôi có thể kết nối với thư viện và tải thành công phiên bản Library-instance. Nhưng khi tôi gọi library-> getGateway() trong chính ứng dụng của tôi, tôi nhận được lỗi sau:

symbol lookup error: ./gateways/libSwisscomXtraZone.so: undefined symbol: _ZN9BCGateway8instanceEv

bạn có thể vui lòng cho tôi một gợi ý, làm thế nào tôi có thể giải quyết này? Tôi bị kẹt.

Cảm ơn.

Trả lời

7

tôi đặt các lỗi thông qua c++filt, nó nói rằng tên đọc sai là viết tắt của

BCGateway::instance() 

Điều này cho thấy bạn gọi BCGateway::instance() đâu đó và quên để liên kết chống lại BCGateway.o hay thậm chí bạn quên để xác định BCGateway::instance().

+0

Viết nhận xét cuối cùng của tôi, tôi thấy, rằng tôi vừa quên thêm BCGateway.h và BCGateway.cpp vào tệp dự án của tôi, trong đó makefile được tạo ra. Vì vậy, lớp này thực sự không được khai báo trong thư viện của tôi. Vì tôi rất mới với các thư viện C++, tôi nghĩ rằng đó là một vấn đề với việc khai báo thư viện hay như vậy. Cảm ơn sự giúp đỡ của bạn. –

1

tất cả các thành viên tĩnh phải được intialised trong tệp cpp. Nhìn thấy như BCGateway :: dụ không được intialised tại bất kỳ điểm nào nó sẽ không thể tìm thấy biểu tượng. Tuy nhiên, vấn đề là nếu bạn tạo BCGateway.cpp và khởi tạo cá thể thì bạn sẽ chỉ có một cá thể trên, có khả năng, nhiều tiến trình. Điều này có thể hoặc không có thể là một vấn đề tùy thuộc vào cách bạn sử dụng DLL.

+0

Các trường hợp sẽ không được chia sẻ giữa các quy trình. Ngay cả trong một thư viện được chia sẻ. –

+0

Tất cả các ký hiệu cần phải được 'xác định'. Điều này chỉ là 'tuyên bố'. Tôi đoán đó là những gì bạn muốn nói. (Trái với 'khởi tạo') – xtofl

+0

Chúc mừng xtofl. Bạn hoàn toàn đúng :) – Goz

Các vấn đề liên quan