qt - 未定义引用`_imp ___ Z * misc * googleDNS *'

时间:2017-01-10 06:47:33

标签: c++ qt

美好的一天

请注意: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的原因,我会使用这个&#34;方法&#34;用于声明和实例化静态字符串。

是什么/可能导致这个&#34; _imp __&#34;错误吗

帮助将不胜感激!

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

_________________________________________________________________________

ANSWER /溶液

首先,感谢@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重建,然后重建,然后继续前进到#34; main&#34;图书馆 - 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);
//...

但后者是首选。

希望这有助于其他人!

1 个答案:

答案 0 :(得分:2)

两个问题:

  1. 除非您创建misc类的实例,否则不会调用构造函数。

  2. 在构造函数中,您将变量定义为 local 变量。 static成员变量根本没有定义。

  3. 要解决此问题,我首先建议您使用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...
    }