title: (C++) Linking with namespaces causes duplicate symbol error
body: <p>For the past few days, I have been trying to figure out how to link the files for a CLI gaming project I have been working on. There are two halves of the project, the Client and the Server code. </p>
  
  <p>The client needs two libraries I've made. The first is a general purpose game board. This is split between GameEngine.h and GameEngine.cpp. The header file looks something like this</p>
  
  <pre><code>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
      }
  }
  </code></pre>
  
  <p>And the CPP file is just giving everything content</p>
  
  <pre><code>#include "GameEngine.h"
  
  type gfdGaming::board::functions
  </code></pre>
  
  <p>The client also has game-specific code (in this case, TicTacToe) split into declarations and definitions (TTT.h, Client.cpp). TTT.h is basically </p>
  
  <pre><code>#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
  </code></pre>
  
  <p>I made the decision to put this in a namespace to group it instead of a class because there are some parts that would not work well in OOP, and it's much easier to implement later on.</p>
  
  <p>I have had trouble linking the client in the past, but this setup seems to work.</p>
  
  <p>My server is also split into two files, Server.h and Server.cpp.</p>
  
  <p>Server.h contains exactly:</p>
  
  <pre><code>#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*);
  </code></pre>
  
  <p>And in the CPP file I include Server.h and provide main() and the contents of all functions previously declared.</p>
  
  <p><strong>Now to the problem at hand</strong>
  I am having issues when linking my server. More specifically, I get a duplicate symbol error for every variable in nsTicTacToe (and possibly in gfdGaming as well). Since I need the TicTacToe functions, I link Client.cpp ( without main() ) when building the server</p>
  
  <pre><code>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
  </code></pre>
  
  <p><strong>Essentially, I am looking for any advice on how to better organize my code to hopefully fix these errors.</strong></p>
  
  <p><strong>Disclaimers:</strong>
  -I apologize in advance if I provided too much or too little information, as it is my first time posting</p>
  
  <p>-I have tried using static and extern to fix these problems, but apparently those are not what I need</p>
  
  <p>Thank you to anyone who takes the time to read all of this and respond =)</p>