大家好
请注意:此处的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/