我有一个Visual C++项目,在其中添加了Rapidjson库,该库经测试可以正常工作。但是,当我向嵌套类添加rapidjson::Document类型时,尝试进行编译时会引发LNK2019错误。该项目是用于创建DLL的动态库。

这是我的 main.h 中的定义:

class coreBD {
string conn;
string proxy;
int type;
Document test;

enum dataBases {
    Sqlite,
    SqlServer,
    None
};

string queryBD(string sSQL);
string queryHTTP(string sSQL);

string httpRequest(string url, string proxy);

static string getNow(string format);
static string urlEncode(string url);
static bool startsWith(string source, string with);

public:

enum access {
    dbConn,
    HTTPProtocol
};

//Nested class
class jsonObj {
    string jsonStr;
    string message;
    Document doc; //HERE IS THE PROBLEM
    bool validMsg;

public:
    enum response {
        FullResponse,
        SQLResponse
    };

    jsonObj(string json);
    string getJsonStr(response rType);
    string getErrorMsg();
    bool isValidResponse();
};

coreBD(string connStr, access connType);
jsonObj query(string sSQL);
void setProxy(string proxy);
};

这是错误:



当我在代码中用“这里是问题”注释掉的行时,错误消失了。如您所见,在test类中使用coreBD变量不会导致任何错误。嵌套类中仅存在rapidjson::Document类型的变量会导致显示错误。是否使用它都没关系。

可能是什么问题呢?

编辑:

收集了新信息。

当我在父类中使用嵌套类时出现问题,但仅在方法的return中使用。换句话说:我可以创建所有类型为rapidjson::Document的成员变量,可以在coreBD类中创建一个方法为jsonObj的方法,可以在该方法中实例化jsonObj,但是如果该类不能返回jsonObj类型的值 jsonObj声明了一个rapidjson::Document成员变量。

例如,这个新创建的方法:
jsonObj coreBD::testOBJ()
{
    string json = "{error:null, message:None, errorMessage:MoreNone}";
    jsonObj b(json);
    return b; //It fails here if I return a nested class with a rapidjson::Document in it. Returning NULL works
}

编辑:

继续解决此问题的新问题:Perform a copy of Document object of rapidjson

最佳答案

查看错误,看来返回jsonObj的函数正在做某种复制或移动构造,作为返回值的一部分,而底层类可能不允许这些构造函数成为私有(private)成员,从而不允许这样做。

有些类的设计要求禁止复制或分配,以防止内存泄漏,或者因为对象是单例类型的对象,并且只允许该对象的一个​​版本。

查看此documentation on rapidjson,有关“移动”语义的部分可能有相关说明。看来他们在阻止复制以提高性能。

关于c++ - LNK2019:带有RapidJSON的 “Unresolved external symbol”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22682513/

10-12 19:00