c++ - qt - 对 `_imp___Z*misc*googleDNS*' 的 undefined reference

标签 c++ qt

大家好

请注意:这里是 C++ 新手

背景信息:

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

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

问题:

错误读取:

netman.cpp:65: error: undefined reference to `_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);
//...

但后者是首选。

希望这对其他人有帮助!

最佳答案

两个问题:

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

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

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

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

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/

相关文章:

python - pyqt 中的拖拽启动

c++ - 统一容器特性

c++ - 替代 rand() 以避免竞争条件?

c++ - 为特定的模板方法实例定义别名

qt - Component.onCompleted 提示 "Non-existent attached object"

c++ - AttachConsole 和 QProcess::readAll()

linux - localsocket服务器未收到readyread信号

c++ - 在 main 函数调用期间使用 main 上面的模板类给出错误

c++ - Ubuntu Qt 链接 boost 日志

qt - 将外部SQLite数据库导入我的项目