无法解析的外部符号问题

_Wanderer2199 2021-02-19 01:36:31
QQTangClient.hpp:
namespace QQTangCheatEngine
{
class CQQTangClient
{
...
};
CQQTangClient g_QQTangClient;
}


QQTCheatEngine.hpp:
#include "CCall.hpp"
namespace QQTangCheatEngine
{ class CQQTangCheatEngine
{
private:
CCall m_call;
public:
void CreateRoom ( )
{
m_call.CreateRoom ( );
}
};
}


CCall.hpp:
namespace QQTangCheatEngine
{
class CCall
{
private:

public:
void CreateRoom()
{
typedef void(__cdecl *pCreateRoom)();
pCreateRoom(g_QQTangClient.m_CreateRoom)();
}
};
}


WANDERER.CPP中定义
#include "QQTangCheatEngine.hpp"
using namespace QQTangCheatEngine;
extern QQTangCheatEngine::CQQTangClient g_QQTangClient;
CQQTangCheatEngine Engine;


Wanderer.cpp是一个项目
QQTangClient.hpp,QQTCheatEngine.hpp,CCall.hpp是另一个项目


错误提示:1>WANDERER.obj : error LNK2001: 无法解析的外部符号 "class QQTangCheatEngine::CQQTangClient QQTangCheatEngine::g_QQTangClient" (?g_QQTangClient@QQTangCheatEngine@@3VCQQTangClient@1@A)
...全文
251 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
_Wanderer2199 2021-02-21
  • 打赏
  • 举报
回复
引用 7 楼 zgl7903 的回复:
先包含对应的头文件

//global.h
#pragma once
#include "QQTangClient.hpp"
#include "QQTangCheatEngine.hpp"

extern QQTangCheatEngine::CQQTangClient g_QQTangClient;
extern QQTangCheatEngine::CQQTangCheatEngine Engine;

//global.cpp
#include "global.h"
namespace QQTangCheatEngine
{
  CQQTangClient g_QQTangClient;
  CQQTangCheatEngine Engine;
}
9楼的问题解决了,我把namespace QQTangCheatEngine {BOOL IsPropToServer (ItemByGame PropID )}这个函数声明定义放到Global.cpp里了

//Global.cpp
#include "GlobalValue.h"
namespace QQTangCheatEngine
{
	CQQTangClient g_QQTangClient;
	CQQTangCheatEngine Engine;
	BOOL IsPropToServer(ItemByGame PropID)
	{...}
}

//Global.h
#pragma once
#include "QQTangCheatEngine.hpp"
extern QQTangCheatEngine::CQQTangClient g_QQTangClient;
extern QQTangCheatEngine::CQQTangCheatEngine Engine;

//CDialog_Tab4.cpp
void CDialog_Tab4::OnBnClickedBtnMapMatch1()
{
	// TODO: 在此添加控件通知处理程序代码
	Engine.SelMap(QQTangCheatEngine::MapID::MAP_CONTEST01_8, QQTangCheatEngine::GameModle::MODLE_MATCH);
}
错误提示:1>CDialog_Tab4.obj : error LNK2001: 无法解析的外部符号 "class QQTangCheatEngine::CQQTangCheatEngine Engine" (?Engine@@3VCQQTangCheatEngine@QQTangCheatEngine@@A)
_Wanderer2199 2021-02-21
  • 打赏
  • 举报
回复
引用 7 楼 zgl7903 的回复:
先包含对应的头文件

//global.h
#pragma once
#include "QQTangClient.hpp"
#include "QQTangCheatEngine.hpp"

extern QQTangCheatEngine::CQQTangClient g_QQTangClient;
extern QQTangCheatEngine::CQQTangCheatEngine Engine;

//global.cpp
#include "global.h"
namespace QQTangCheatEngine
{
  CQQTangClient g_QQTangClient;
  CQQTangCheatEngine Engine;
}
前面IsPropToServer函数报错说错了不好意思,经过前辈这样改动之后,错误提示:error LNK2005: "int __cdecl QQTangCheatEngine::IsPropToServer(enum QQTangCheatEngine::ItemByGame)" (?IsPropToServer@QQTangCheatEngine@@YAHW4ItemByGame@1@@Z) 已经在 CDialog_Tab1.obj 中定义 很多个头文件包含了Maple.hpp,但是只有全局函数提示重定义,而类内的函数没有提示

//Maple.hpp:
namespace QQTangCheatEngine
{	
class CItemByDrop
	{
public:
BOOL IsPropToServer ( )
        {
            switch ( m_ItemID )
            {
                //81
                case QQTangCheatEngine::GAME_TONGBI:
                {
                    return TRUE;
                }
                //82
                case QQTangCheatEngine::GAME_YINBI:
                {
                    return TRUE;
                }
......
}
}
};

BOOL IsPropToServer (ItemByGame PropID )
    {
        switch ( PropID )
        {
            //81
            case QQTangCheatEngine::GAME_TONGBI:
            {
                return TRUE;
            }
            //82
            case QQTangCheatEngine::GAME_YINBI:
            {
                return TRUE;
            }
......
}
}
}
_Wanderer2199 2021-02-20
  • 打赏
  • 举报
回复
引用 7 楼 zgl7903的回复:
先包含对应的头文件

//global.h
#pragma once
#include "QQTangClient.hpp"
#include "QQTangCheatEngine.hpp"

extern QQTangCheatEngine::CQQTangClient g_QQTangClient;
extern QQTangCheatEngine::CQQTangCheatEngine Engine;

//global.cpp
#include "global.h"
namespace QQTangCheatEngine
{
  CQQTangClient g_QQTangClient;
  CQQTangCheatEngine Engine;
}
前辈请看5楼 如果头文件包含的话会提示重复定义 是不是需要把hpp里的函数定义放在cpp,cpp包含hpp
zgl7903 2021-02-20
  • 打赏
  • 举报
回复
先包含对应的头文件

//global.h
#pragma once
#include "QQTangClient.hpp"
#include "QQTangCheatEngine.hpp"

extern QQTangCheatEngine::CQQTangClient g_QQTangClient;
extern QQTangCheatEngine::CQQTangCheatEngine Engine;

//global.cpp
#include "global.h"
namespace QQTangCheatEngine
{
  CQQTangClient g_QQTangClient;
  CQQTangCheatEngine Engine;
}
_Wanderer2199 2021-02-20
  • 打赏
  • 举报
回复
引用 4 楼 zgl7903 的回复:
变量不要放在头文件
//QQTangClient.hpp
namespace QQTangCheatEngine
{
class CQQTangClient
{
...
};
//CQQTangClient g_QQTangClient;
}

//WANDERER.CPP
#include "QQTangCheatEngine.hpp"
using namespace QQTangCheatEngine;
CQQTangClient g_QQTangClient;
CQQTangCheatEngine Engine;
5L我猜测原因是QQTangPackage.hpp里的BOOL IsPropToServer ( )函数定义过长,形成不了内联函数所以提示重定义。如果我使用类前置声明的方法: Global.h:
class CQQTangClient;
class CQQTangCheatEngine;
extern QQTangCheatEngine::CQQTangClient g_QQTangClient;
extern QQTangCheatEngine::CQQTangCheatEngine Engine;
Global.cpp:
namespace QQTangCheatEngine
{
	CQQTangClient g_QQTangClient;
	CQQTangCheatEngine Engine;
}
会提示“QQTangCheatEngine”: 不是类或命名空间名称,如何在Global.h里声明QQTangCheatEngine是一个名称空间呢
_Wanderer2199 2021-02-20
  • 打赏
  • 举报
回复
引用 4 楼 zgl7903 的回复:
变量不要放在头文件
//QQTangClient.hpp
namespace QQTangCheatEngine
{
class CQQTangClient
{
...
};
//CQQTangClient g_QQTangClient;
}

//WANDERER.CPP
#include "QQTangCheatEngine.hpp"
using namespace QQTangCheatEngine;
CQQTangClient g_QQTangClient;
CQQTangCheatEngine Engine;
可以了前辈,但出现了新问题: Global.h:
#include "QQTangCheatEngine.hpp"
extern QQTangCheatEngine::CQQTangClient g_QQTangClient;
extern QQTangCheatEngine::CQQTangCheatEngine Engine;
Global.cpp:
namespace QQTangCheatEngine
{
	CQQTangClient g_QQTangClient;
	CQQTangCheatEngine Engine;
}
CDialog_Tab2.cpp包含了Global.h,因为要用到Gloabl.h里的extern声明 于是,编译错误提示1>CDialog_Tab2.obj : error LNK2005: "int __cdecl QQTangCheatEngine::IsPropToServer(enum QQTangCheatEngine::ItemByGame)" (?IsPropToServer@QQTangCheatEngine@@YAHW4ItemByGame@1@@Z) 已经在 CDialog_Tab1.obj 中定义 QQTangPackage.hpp:

class CNPCGETITEM :public CPACKAGEBASE
	{
public:
	ItemByGame m_PropID;//游戏道具enum ItemByGame
BOOL IsPropToServer ( )
		{
			switch ( m_PropID )
			{
				//81
				case QQTangCheatEngine::GAME_TONGBI:
				{
					return TRUE;
				}
					//82
				case QQTangCheatEngine::GAME_YINBI:
				{
					return TRUE;
				}...
};
请教有什么好的使用方法吗,就是我有很多cpp文件包含了Global.h 因为要用到extern声明
zgl7903 2021-02-19
  • 打赏
  • 举报
回复
变量不要放在头文件
//QQTangClient.hpp
namespace QQTangCheatEngine
{
class CQQTangClient
{
...
};
//CQQTangClient g_QQTangClient;
}

//WANDERER.CPP
#include "QQTangCheatEngine.hpp"
using namespace QQTangCheatEngine;
CQQTangClient g_QQTangClient;
CQQTangCheatEngine Engine;
_Wanderer2199 2021-02-19
  • 打赏
  • 举报
回复
什么lib....
兔子-顾问 2021-02-19
  • 打赏
  • 举报
回复
是不是Lib没导入

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧