美好的一天
请注意: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);
//...
但后者是首选。
希望这有助于其他人!
答案 0 :(得分:2)
两个问题:
除非您创建misc
类的实例,否则不会调用构造函数。
在构造函数中,您将变量定义为 local 变量。 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...
}