大家好

请注意:此处的C ++新手

背景信息:

我一直在尝试创建一组库,其中一些库相互使用。

在这种特殊情况下,我必须将DLL库添加为外部库。

问题:

错误读取:


  netman.cpp:65:错误:未定义对_imp___ZN4misc9googleDNSE的引用


主库中的代码:

//netmap.cpp-部分

//...
QHostAddress serverIP = QHostAddress(misc().googleDNS);
//...


//Misc.h-部分

#ifndef MISC_H
#define MISC_H

#include "misc_global.h"

#include <QString>
#include <QList>


class MISCSHARED_EXPORT misc
{
public:
    misc();
    ~misc();

    //Network related
    static QString googleDNS;

    //Command Codes
    static QString CMD_AUTH;
    static QString CMD_REQ;

    struct User_Settings{
    //...
};


//misc.cpp-部分

#include "misc.h"

misc::misc(){

    //Network related
    QString googleDNS = QString("8.8.8.8");

    //Command Codes
    QString CMD_AUTH = QStringLiteral("AUTH");
    QString CMD_REQ = QStringLiteral("REQ");

    //Request Codes
    QString REQ_USER_INFO = QStringLiteral("USER_INFO");
    QString REQ_VPN_DATA = QStringLiteral("VPN_DATA");
    QString REQ_VPN_UP = QStringLiteral("VPN_UP");

    //...
}


注意:如果您可能会问misc().googleDNS的原因,我正在使用此“方法”来声明和实例化静态字符串。

是什么/可能引起此“ _imp__”错误?

帮助将不胜感激!

如果需要更多信息,请发表评论,我将更新并添加

_________________________________________________________________________

解答/解决方案

首先,感谢@SomeProgrammingDude提供的解决方案。

//misc.h

#ifndef MISC_H
#define MISC_H

#include "misc_global.h"

#include <QString>
#include <QList>

namespace Misc {

    //Network related
    QString googleDNS = QString("8.8.8.8");

    //Command Codes
    QString CMD_AUTH = QString("AUTH");
    QString CMD_REQ = QString("REQ");

    //Request Codes
    QString REQ_USER_INFO = QString("USER_INFO");
    QString REQ_VPN_DATA = QString("VPN_DATA");
    QString REQ_VPN_UP = QString("VPN_UP");

    class MISCSHARED_EXPORT misc
    {
    public:
        misc();
        ~misc();

        //...

    };

    //...
}
#endif // MISC_H


//misc.cpp

#include "misc.h"

using namespace Misc;

misc::misc(){}

misc::~misc(){}

//...


通过运行qmake进行重建,然后重建并进入“主”库-netman

//netman.h

//...
#include "misc.h"
#include "gen.h"

using namespace Misc;

class NETMANSHARED_EXPORT netman
{

public:
    netman();
    netman(QString hostname);
//...
};

#endif // NETMAN_H


//netman.cpp

#include "netman.h"

using namespace Misc;

netman::netman(){
}


那么可以使用以下两种方法之一,非常相似:

//...
QHostAddress serverIP = QHostAddress(googleDNS);
//...


要么

//...
QHostAddress serverIP = QHostAddress(Misc::googleDNS);
//...


但后者是首选。

希望这对别人有帮助!

最佳答案

两个问题:


除非您创建misc类的实例,否则不会调用构造函数。
在构造函数中,将变量定义为局部变量。 static成员变量根本没有定义。


为了解决该问题,我首先建议您使用namespace而不是类。只有公共成员和静态成员的类并不比简单的namespace好(我回避了有关全局变量的整个问题)。

然后,您需要定义变量,您需要在任何函数之外执行这些变量。直接在文件中执行:

QString misc::googleDNS = QString("8.8.8.8");




要将其放在一起,您需要两个文件。

首先是头文件:

#ifndef MISC_H
#define MISC_H

#include "misc_global.h"

#include <QString>
#include <QList>

namespace misc
{
    //Network related
    MISCSHARED_EXPORT QString googleDNS;

    // etc...
}

#endif


然后有源文件:

#include "mish.h"

namespace misc
{
    QString googleDNS = QString("8.8.8.8");

    // etc...
}

关于c++ - qt-对“_imp ___ Z * misc * googleDNS *”的 undefined reference ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41562733/

10-11 19:53