gpt4 book ai didi

c++ - (C++) 与命名空间链接导致重复符号错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:02:58 25 4
gpt4 key购买 nike

在过去的几天里,我一直在努力弄清楚如何为我一直从事的 CLI 游戏项目链接文件。项目分为两部分,客户端和服务器代码。

客户需要我制作的两个库。第一个是通用游戏板。这在 GameEngine.h 和 GameEngine.cpp 之间分开。头文件看起来像这样

namespace gfdGaming {

// struct sqr_size {
// Index x;
// Index y;
// };
typedef struct { Index x, y; } sqr_size;
const sqr_size sPos = {1, 1};
sqr_size sqr(Index x, Index y);
sqr_size ePos;
class board
{
// Prototypes / declarations for the class
}
}

CPP 文件只是提供所有内容

#include "GameEngine.h"

type gfdGaming::board::functions

客户端还有特定于游戏的代码(在本例中为 TicTacToe),分为声明和定义(TTT.h、Client.cpp)。 TTT.h 基本上是

#include "GameEngine.h"

#define TTTtar "localhost"
#define TTTport 2886

using namespace gfdGaming;
void* turnHandler(void*);
namespace nsTicTacToe
{
GFDCON gfd;
const char X = 'X';
const char O = 'O';
string MPhostname, mySID;
board TTTboard;
bool PlayerIsX = true, isMyTurn;
char Player = X, Player2 = O;

int recon(string* datHolder = NULL, bool force = false);
void initMP(bool create = false, string hn = TTTtar);
void init();
bool isTie();
int turnPlayer(Index loc, char lSym = Player);
bool checkWin(char sym = Player);

int mainloop();

int mainloopMP();

}; // NS

我决定将它放在一个命名空间中而不是一个类中,因为有些部分在 OOP 中不能很好地工作,而且以​​后更容易实现。

我过去在链接客户端时遇到过问题,但这个设置似乎有效。

我的服务器也分为两个文件,Server.h 和 Server.cpp。

Server.h 完全包含:

#include "../TicTacToe/TTT.h" // Server needs a full copy of TicTacToe code

class TTTserv;
struct TTTachievement_requirement {
Index id;
Index loc;
bool inUse;
};
struct TTTachievement_t {
Index id;
bool achieved;
bool AND, inSameGame;
bool inUse;
bool (*lHandler)(TTTserv*);
char mustBeSym;
int mustBePlayer;
string name, description;
TTTachievement_requirement steps[safearray(8*8)];

};

class achievement_core_t : public GfdOogleTech {
public: // May be shifted to private
TTTachievement_t list[safearray(8*8)];
public:
achievement_core_t();

int insert(string name, string d, bool samegame, bool lAnd, int lSteps[8*8], int mbP=0, char mbS=0);
};


struct TTTplayer_t {
Index id;
bool inUse;
string ip, sessionID;
char sym;
int desc;
TTTachievement_t Ding[8*8];
};
struct TTTgame_t {
TTTplayer_t Player[safearray(2)];
TTTplayer_t Spectator;
achievement_core_t achievement_core;
Index cTurn, players;
port_t roomLoc;
bool inGame, Xused, Oused, newEvent;
};


class TTTserv : public gSserver {
TTTgame_t Game;
TTTplayer_t *cPlayer;

port_t conPort;
public:
achievement_core_t *achiev;
thread threads[8];
int parseit(string tDat, string tsIP);
Index conCount;
int parseit(string tDat, int tlUser, TTTplayer_t** retval);

private:
int parseProto(string dat, string sIP);
int parseProto(string dat, int lUser);

int cycleTurn();
void setup(port_t lPort = 0, bool complete = false);

public:
int newEvent;
TTTserv(port_t tlPort = TTTport, bool tcomplete = true);

TTTplayer_t* userDC(Index id, Index force = false);
int sendToPlayers(string dat, bool asMSG = false);
int mainLoop(volatile bool *play);
};



// Other
void* userHandler(void*);
void* handleUser(void*);

在 CPP 文件中,我包含了 Server.h 并提供了 main() 和之前声明的所有函数的内容。

现在解决手头的问题我在链接服务器时遇到问题。更具体地说,我在 nsTicTacToe 中(也可能在 gfdGaming 中)的每个变量都出现重复符号错误。由于我需要 TicTacToe 功能,因此在构建服务器时链接了 Client.cpp(没有 main() )

ld: duplicate symbol nsTicTacToe::PlayerIsX       in Client.o and Server.o
collect2: ld returned 1 exit status
Command /Developer/usr/bin/g++-4.2 failed with exit code 1

It stops once a problem is encountered, but if PlayerIsX is removed / changed temporarily than another variable causes an error

本质上,我正在寻找有关如何更好地组织我的代码以希望修复这些错误的任何建议。

免责声明:-如果我提供的信息太多或太少,我提前道歉,因为这是我第一次发帖

-我曾尝试使用 static 和 extern 来解决这些问题,但显然那些不是我需要的

感谢所有花时间阅读所有内容并做出回应的人 =)

最佳答案

你会得到关于重复定义的错误,因为那是你所拥有的:每次 .cpp 文件包含 TTT.h 时,都会定义一个全局 bool PlayerIsX(在 nsTicTacToe 命名空间中,但仍然是全局的)。在这种情况下,包含它的是 Server.cpp 和 Client.cpp。

解决此问题的一种方法是使用 extern 将定义更改为声明,然后在相应的 .cpp 文件(例如 TTT.cpp)中进行实际定义。

在 TTT.h 中:

namespace nsTicTacToe {
...
extern bool PlayerIsX;
...
}

在 TTT.cpp 中:

#include "TTT.h"

bool nsTicTacToe::PlayerIsX;

其他定义依此类推。

顺便说一句,记得要有适当的守卫 #ifdefs:

#ifndef __TTT_H
#define __TTT_H
... header contents
#endif // __TTT_H

关于c++ - (C++) 与命名空间链接导致重复符号错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4702579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com