지난 며칠 동안 필자는 내가 작업해온 CLI 게임 프로젝트의 파일을 연결하는 방법을 알아 내려고 노력했습니다. 프로젝트에는 Client와 Server 코드의 두 부분이 있습니다.(C++) 네임 스페이스로 링크하면 중복 심볼 오류가 발생합니다.
고객은 내가 만든 두 개의 라이브러리가 필요합니다. 첫 번째는 범용 게임 보드입니다. 이것은 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의 두 파일로 나뉩니다.
#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을 포함 (기본 제공) 및 모든 기능의 내용은 이전에 선언 :
Server.h 정확히 들어 있습니다.
지금 당장의 문제 내 서버를 연결할 때 문제가 있습니다. 더 구체적으로 말하면 nsTicTacToe의 모든 변수에 대해 중복 심볼 오류가 발생합니다 (gfdGaming에서도 가능). 나는를 사용하여 ticTacToe 기능을 필요로하기 때문에, 나는 서버
기본적으로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
을 구축 할 때, 내가 더 잘 희망 이러한 오류를 해결하기 위해 내 코드를 구성하는 방법에 대한 조언을 찾고 있어요 (주는()없이) Client.cpp 연결 .
면책 조항 : 내가 너무 많거나 너무 적은 정보를 제공하는 경우 이러한 문제를 해결하기 위해 정적 및 통근자를 사용하여 시도
-I를 올리기 내 처음으로 - 난, 미리 사과 하지만, 그 때문에 분명히 사람들은 당신이 무엇을 내가) =
이 모두를 읽고 응답 할 시간이 걸립니다 누구에게 감사해야 할
헤더 가드를 사용해보십시오. 사용하고 있지 않습니다. – DumbCoder
나는 아래에 답을 주었지만 다른 의견 작성자들이 지적한 것처럼 헤더 가드를 사용한다. – lefticus
그는 머리말을 붙이는 데 어려움을 겪고 있기 때문에 헤더 가드는 사용하지 않는 것보다 항상 사용하는 편이 나을지 모르지만 그의 유일한 문제는 아닙니다. – stnr