C++ Xcode错误:";2个用于架构x86“U 64”的重复符号;

C++ Xcode错误:";2个用于架构x86“U 64”的重复符号;,c++,xcode,C++,Xcode,当我试图编译时,我不断地遇到这个错误,但不知道为什么 Ld /Users/Itunes/Library/Developer/Xcode/DerivedData/BATTLESHIP-gefqfgwzntvzlvfyyxoqzmmanjlb/Build/Products/Debug/BATTLESHIP normal x86_64 cd /Users/Itunes/Desktop/Programs/CMPSC122/BATTLESHIP setenv MACOSX_DEPLOYME

当我试图编译时,我不断地遇到这个错误,但不知道为什么

Ld /Users/Itunes/Library/Developer/Xcode/DerivedData/BATTLESHIP-gefqfgwzntvzlvfyyxoqzmmanjlb/Build/Products/Debug/BATTLESHIP normal x86_64
    cd /Users/Itunes/Desktop/Programs/CMPSC122/BATTLESHIP
    setenv MACOSX_DEPLOYMENT_TARGET 10.7
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk -L/Users/Itunes/Library/Developer/Xcode/DerivedData/BATTLESHIP-gefqfgwzntvzlvfyyxoqzmmanjlb/Build/Products/Debug -F/Users/Itunes/Library/Developer/Xcode/DerivedData/BATTLESHIP-gefqfgwzntvzlvfyyxoqzmmanjlb/Build/Products/Debug -filelist /Users/Itunes/Library/Developer/Xcode/DerivedData/BATTLESHIP-gefqfgwzntvzlvfyyxoqzmmanjlb/Build/Intermediates/BATTLESHIP.build/Debug/BATTLESHIP.build/Objects-normal/x86_64/BATTLESHIP.LinkFileList -mmacosx-version-min=10.7 -stdlib=libc++ -o /Users/Itunes/Library/Developer/Xcode/DerivedData/BATTLESHIP-gefqfgwzntvzlvfyyxoqzmmanjlb/Build/Products/Debug/BATTLESHIP

duplicate symbol __ZlsRNSt3__113basic_ostreamIcNS_11char_traitsIcEEEERK5Point in:
    /Users/Itunes/Library/Developer/Xcode/DerivedData/BATTLESHIP-gefqfgwzntvzlvfyyxoqzmmanjlb/Build/Intermediates/BATTLESHIP.build/Debug/BATTLESHIP.build/Objects-normal/x86_64/main.o
    /Users/Itunes/Library/Developer/Xcode/DerivedData/BATTLESHIP-gefqfgwzntvzlvfyyxoqzmmanjlb/Build/Intermediates/BATTLESHIP.build/Debug/BATTLESHIP.build/Objects-normal/x86_64/Board.o
duplicate symbol __ZlsRNSt3__113basic_ostreamIcNS_11char_traitsIcEEEERK5Point in:
    /Users/Itunes/Library/Developer/Xcode/DerivedData/BATTLESHIP-gefqfgwzntvzlvfyyxoqzmmanjlb/Build/Intermediates/BATTLESHIP.build/Debug/BATTLESHIP.build/Objects-normal/x86_64/main.o
    /Users/Itunes/Library/Developer/Xcode/DerivedData/BATTLESHIP-gefqfgwzntvzlvfyyxoqzmmanjlb/Build/Intermediates/BATTLESHIP.build/Debug/BATTLESHIP.build/Objects-normal/x86_64/Ship.o
ld: 2 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我的头文件和.cpp文件是

Board.h
// Board.h - Board class declaration

#pragma once

#include "Point.h"
using namespace std;


#define HIT 'X'
#define SHIP 'S'
#define MISS 'O'
#define WATER '~'

class Board
{
public:
    // Constructor
    Board();

    // Function which prints an image of the board showing hits ( X ) and misses ( O )
    void PrintBoard();


    // Resets the board for both players before new games begin
    void ResetBoard();

    // Marks both boards after each guess
    void MarkBoard(bool hit, Point guessCoordinate);

    // Returns TRUE if the user has guessed the given coordinate
    bool CheckGuess( Point guessCoordinate );


private:
    // Board used for determining whether the user has guessed a certain position yet or not 
    bool playerBoard[BOARD_WIDTH][BOARD_LENGTH] = {false};
    // Board used soley for output
    // KEY: 0 = not yet guessed, 1 = hit, 2 = miss
    // intialize all spaces to 0 to show that no guesses have been made yet
    int outputBoard[10][10] = { 0 };

};
Board.cpp

// Board.cpp - Board class function implementation

#include "Board.h"


Board::Board()
{

}


// Prints the output board to console
void Board::PrintBoard()
{
    // Print column numbers
    cout << "   \t" << " " << 1;
    for( int number = 2; number < 11; number++)
        cout << " " << number;
    cout << endl;

    // Print board itself
    // i = row number, j = column number
    for( int i = 0; i < 10; i++)
    {
        // int i can double as a row and column counter for checking if a space has been hit

        /*cout << " \t";
        // Print row lines
        for( int k = 1; k < 11; k++)
            cout << " __";*/
        cout << endl;
        // Print row number
        cout << i+1 << " ";
        cout << "\t";
        // Print columns 
        for( int j = 0; j < 10; j++)
        {
            cout << "|";

            // INSERT CODE THAT PLACES X OR O IF GUESS IS HIT OR SHIP
            if( outputBoard[i][j] == 0 )
                cout << WATER;
            if( outputBoard[i][j] == 1 )
                cout << HIT;
            if( outputBoard[i][j] == 2 )
                cout << MISS;

        }
        cout << "|";
        cout << endl;
    }
    cout << endl;
}


void Board::MarkBoard(bool hit, Point guessCoordinate)
{
    // First mark the board to show the player has guessed this coordinate
    playerBoard[guessCoordinate.X][guessCoordinate.Y] = true;

    if( hit == true )
    {
        // Show that the player hit a ship
        outputBoard[guessCoordinate.X][guessCoordinate.Y] = 1;
    }
    else
    {
        // Show that the player missed the ship
        outputBoard[guessCoordinate.X][guessCoordinate.Y] = 2;
    }
}


bool Board::CheckGuess(Point guessCordinate)
{
    bool previouslyGuessed = false;

    // If the given point has already been guessed, make the function return true
    if( playerBoard[guessCordinate.X][guessCordinate.Y] )
    {
        previouslyGuessed = true;
    }

    else
    {
        previouslyGuessed = false;
    }

    return previouslyGuessed;
}
//Board.cpp-Board类函数实现
#包括“Board.h”
Board::Board()
{
}
//将输出板打印到控制台
void Board::PrintBoard()
{
//打印列号

无法在此处添加
inline

inline ostream& operator <<(ostream& out, const Point& myPoint)
^^^^^^
{
    out << "(" << myPoint.X << "," << myPoint.Y << ")";
    return out;
}

inlineostream&operator问题是您正在重新定义
操作符这个愚蠢的操作符,但是请确保您没有在某个地方错误地导入.m文件

很可能您的Xcode项目中有对象文件(.o)。Xcode不喜欢这样。删除对象文件,代码应该编译

#include "Ship.h"


Ship::Ship()
{

}


void Ship::LoadShips(Ship ship[SHIP_TYPES])
{
    //Sets the default data for the ships
    //we plan to include in the game
    //IMPORTANT!! > MUST MATCH SHIP_TYPES -Default=5 (0-4)
    ship[0].Name = "Cruiser"; ship[0].Length = 2;
    ship[1].Name = "Frigate"; ship[1].Length = 3;
    ship[2].Name = "Submarine"; ship[2].Length = 3;
    ship[3].Name = "Escort"; ship[3].Length = 4;
    ship[4].Name = "Battleship"; ship[4].Length = 5;
}






void Ship::FillShipData( DIRECTION direction, Point coordinate )
{
    Direction = direction;
    int x,y;

    // If the ship will be laid horizontally, give it the initial point plus the x-coordinates to its right 
    if( Direction == HORIZONTAL )
    {
        while( coordinate.X+Length >= BOARD_WIDTH || coordinate.X < 0 || coordinate.Y < 0 || coordinate.Y >= BOARD_LENGTH )
        {
            cout << "Your ship will not be entirely on the board when placed this way. Please choose a new row number and column number separated by a space (ex: x y): ";
            cin >> x >> y;
            coordinate.X = x;
            coordinate.Y = y;

        }

        for( int i = 0; i < Length; i++ )
        {
            spaceOccupied[i] = coordinate;
            coordinate.X++;
        }
    }

    // If the ship will be laid vertically, give it the initial point plus the y-coordinates below it
    else
    {
        // Be sure the give point will contain and the ship
        while( coordinate.Y+Length >= BOARD_LENGTH || coordinate.X < 0 || coordinate.Y < 0 || coordinate.X >= BOARD_WIDTH )
        {
            cout << "Your ship will not be entirely on the board when placed this way. Please choose a new row number and column number separated by a space (ex: x y): ";
            cin >> x >> y;
            coordinate.X = x;
            coordinate.Y = y;

        }

        for( int i = 0; i < Length; i++ )
        {
            spaceOccupied[i] = coordinate;
            coordinate.Y++;
        }
    }
}






// use throwaway to call, one user's guess and the other user's ships
// 
bool Ship::isHit( Point guess, Ship ship[SHIP_TYPES] )
{
    bool hit = false;

    // For loop to examine each ship
    for( int i = 0; i < SHIP_TYPES && hit==false; i++ )
    {
        // For loop to go through each point the ship occupies
        for( int j = 0; j < ship[i].Length && hit==false; j++ )
        {
            // If the player's guess matches a point the ship is located on, it has been hit
            if( ship[i].spaceOccupied[j] == guess )
            {
                hit = true;

                // Inform player they landed a hit
                cout << "Ship: " << ship[i].Name << " has been hit!\n";
            }
        }
    }

    // If the player has missed all ships, inform them
    if( hit == false )
        cout << "Missed.\n";


    return hit;
}
#pragma once

#include <iostream>
using namespace std;

#define BOARD_LENGTH 10
#define BOARD_WIDTH 10

struct Point
{
    // A location on the grid defined
    // by X(horizontal) Y(vertical) coordinates
    int X;
    int Y;

    bool operator == (const Point& compareTo) const
    {
        return ( (X == compareTo.X) && (Y == compareTo.Y) );
    }

};



ostream& operator <<(ostream& out, const Point& myPoint)
{
    out << "(" << myPoint.X << "," << myPoint.Y << ")";
    return out;
}
inline ostream& operator <<(ostream& out, const Point& myPoint)
^^^^^^
{
    out << "(" << myPoint.X << "," << myPoint.Y << ")";
    return out;
}
inline ostream& operator <<(ostream& out, const Point& myPoint) // << add inline
phillip / $ c++filt __ZlsRNSt3__113basic_ostreamIcNS_11char_traitsIcEEEERK5Point
operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, Point const&)
phillip / $