使用共享库时,未在此范围内声明C ++ [class]

时间:2014-08-06 19:05:09

标签: c++

我创建了一个共享库项目,它使用我编写的几个不同的类来完成各种事情。所以我的问题更清楚,请注意下面的标题文件:

TsmClient.h

#include "Headers/Framework/BoostSocket.h"
#include "DataContracts.h"

#ifndef TSMCLIENT_H_
#define TSMCLIENT_H_

using namespace boost;
using namespace boost::asio;

class TsmClient {
public:
    TsmClient();
    TsmClient(std::string host);
    virtual ~TsmClient();

    bool IsConnected();

    friend class WarehouseFramework;

private:
    std::string Communicate(std::string &req);

    std::string serverHost;
    int port;
    std::shared_ptr<BoostSocket> socket;
    io_service service;

    void Connect();
    void Close();
};

本身,这个项目构建得很好并生成一个.so文件。但是,当我尝试在另一个项目中使用此库时,我在访问我在DataContracts.h中编写的类时遇到问题。确切的错误是:

  未在此范围内声明

WarehouseSettingTemplateList'

我能够创建一个TsmClient实例并且整天成功调用函数,并且由于TsmClient.h包含DataContracts.h,我很困惑为什么我不能使用一个类在DataContracts.h中声明。这是否与我将此项目编译为共享库的事实有关?

这是DataContracts.h

    #include "Headers/Framework/Proto/TcpFramework.pb.h"
    #include "Headers/Framework/Proto/ProductManagement.pb.h"
    #include "Headers/Framework/Proto/KioskManagement.pb.h"
    #include "Headers/Framework/Proto/WarehouseManagement.pb.h"
    #include "Headers/Framework/Proto/CashTillManagement.pb.h"
    #include "Headers/Framework/Proto/AccountManagement.pb.h"
    #include "Headers/Framework/Proto/VendorManagement.pb.h"
    #include "Headers/Framework/Proto/ShoppingCartManagement.pb.h"
    #include "Headers/Framework/Proto/Generic.pb.h"
    #include "Headers/Framework/Proto/OfflineManagement.pb.h"
    #include "Headers/Framework/Proto/CouponManagement.pb.h"
    #include "Headers/Utils/Utilities.h"

    using namespace StokedProtoBuf;

    #ifndef DATACONTRACTS_H_
    #define DATACONTRACTS_H_

class WarehouseSettingTemplate {
public:
    long idWarehouse;
    int idWarehouseSettingType;
    std::string Value;
    bool IsEnabled;

    std::string Serialize();
    void Deserialize(const std::string &data);
private:
    WarehouseSettingTemplate_Proto proto;
};

class WarehouseSettingTemplateList {
public:
    std::vector<WarehouseSettingTemplate> settingList;
    std::string Serialize();
    void Deserialize(const std::string &data);
private:
    WarehouseSettingTemplateList_Proto proto;
};

我确信这对我来说是一种愚蠢的疏忽,但它让我疯狂。

2 个答案:

答案 0 :(得分:1)

在我收到的所有帮助之后讨厌回答我自己的问题,但这里出了什么问题......

我的共享库中有一个名为DataContracts.h的头文件。在我的主项目中,我还有一个名为DataContracts.h的头文件

所以我认为我的包含防范可以防止导入共享库头文件。这是我之前第一次真正使用共享库,所以我希望如果他们遇到这个问题,这将有助于其他人。

- 我感觉很糟糕,因为我没有提供足够的信息让其他人回答这个问题。

答案 1 :(得分:0)

首先,你的文件顶部(在你的包含之上)有你的标题保护(#ifndef / #define)更好

其次,确保您的.so和您链接的程序中的每个类都可用。

第三,您不应在类中使用内联声明,否则将在编译时导出,链接器无法选择要使用的定义(.so文件或程序中的定义)。