Xcode链接器命令失败问题

时间:2014-10-08 12:54:58

标签: c++ xcode debugging linker

Ld /Users/noahheath/Library/Developer/Xcode/DerivedData/NBAPlayer-    aeoygjukxhrzaxddvctkqcefsiql/Build/Products/Debug/NBAPlayer normal x86_64
    cd /Users/noahheath/Documents/NBAPlayer
    export MACOSX_DEPLOYMENT_TARGET=10.9
    /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.9.sdk -L/Users/noahheath/Library/Developer/Xcode/DerivedData/NBAPlayer-aeoygjukxhrzaxddvctkqcefsiql/Build/Products/Debug -F/Users/noahheath/Library/Developer/Xcode/DerivedData/NBAPlayer-aeoygjukxhrzaxddvctkqcefsiql/Build/Products/Debug -filelist /Users/noahheath/Library/Developer/Xcode/DerivedData/NBAPlayer-aeoygjukxhrzaxddvctkqcefsiql/Build/Intermediates/NBAPlayer.build/Debug/NBAPlayer.build/Objects-normal/x86_64/NBAPlayer.LinkFileList -mmacosx-version-min=10.9 -stdlib=libc++ -Xlinker -dependency_info -Xlinker /Users/noahheath/Library/Developer/Xcode/DerivedData/NBAPlayer-aeoygjukxhrzaxddvctkqcefsiql/Build/Intermediates/NBAPlayer.build/Debug/NBAPlayer.build/Objects-normal/x86_64/NBAPlayer_dependency_info.dat -o /Users/noahheath/Library/Developer/Xcode/DerivedData/NBAPlayer-aeoygjukxhrzaxddvctkqcefsiql/Build/Products/Debug/NBAPlayer

duplicate symbol __ZN9NFLplayerC1Ev in:
    /Users/noahheath/Library/Developer/Xcode/DerivedData/NBAPlayer-aeoygjukxhrzaxddvctkqcefsiql/Build/Intermediates/NBAPlayer.build/Debug/NBAPlayer.build/Objects-normal/x86_64/UnsortedStruct.o
    /Users/noahheath/Library/Developer/Xcode/DerivedData/NBAPlayer-aeoygjukxhrzaxddvctkqcefsiql/Build/Intermediates/NBAPlayer.build/Debug/NBAPlayer.build/Objects-normal/x86_64/main.o
duplicate symbol __ZN9NFLplayerC2Ev in:
    /Users/noahheath/Library/Developer/Xcode/DerivedData/NBAPlayer-aeoygjukxhrzaxddvctkqcefsiql/Build/Intermediates/NBAPlayer.build/Debug/NBAPlayer.build/Objects-normal/x86_64/UnsortedStruct.o
    /Users/noahheath/Library/Developer/Xcode/DerivedData/NBAPlayer-aeoygjukxhrzaxddvctkqcefsiql/Build/Intermediates/NBAPlayer.build/Debug/NBAPlayer.build/Objects-normal/x86_64/main.o
duplicate symbol __ZN9NFLplayer8ComparedES_ in:
    /Users/noahheath/Library/Developer/Xcode/DerivedData/NBAPlayer-aeoygjukxhrzaxddvctkqcefsiql/Build/Intermediates/NBAPlayer.build/Debug/NBAPlayer.build/Objects-normal/x86_64/UnsortedStruct.o
    /Users/noahheath/Library/Developer/Xcode/DerivedData/NBAPlayer-aeoygjukxhrzaxddvctkqcefsiql/Build/Intermediates/NBAPlayer.build/Debug/NBAPlayer.build/Objects-normal/x86_64/main.o
ld: 3 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

这是我从xcode收到的脚本,我无法找到挽救生命的错误。有人可以帮我调试吗?如果没有以正确的格式显示,请原谅我。这是我第一次使用这个网站。

这是我的主要代码,这里是未排序的结构类

#include "NFL.h"
class UnsortedStruct
{
public:
    UnsortedStruct();
    int GetLength() const;
    bool IsFull() const;
    void EmptyList();
    void InsertItem(NFLplayer nflplayers);
    void DeleteItem(NFLplayer nflplayers);
    void ResetList();
    NFLplayer GetItem(NFLplayer nflPlayers, bool& found);
    NFLplayer GetNextItem();
private:
    int length;
    int currentPos;
    NFLplayer NFLlist[MAX_PLAYERS];
};

#include <string>
using namespace std;

const int MAX_PLAYERS = 10;
enum RelationType1 {LESS1, GREATER1, EQUAL1};

struct NFLplayer//describes the set of information for a NFL player.
{
    string position, school, name, team;
    RelationType1 Compared(NFLplayer);
    NFLplayer();
};

NFLplayer::NFLplayer()
{
    position=" ";
    school=" ";
    name=" ";
    team=" ";
}
RelationType1 NFLplayer::Compared(NFLplayer players)
{
    if(name < players.name)
        return LESS1;
    else if(name > players.name)
        return GREATER1;
    else
        return EQUAL1;
}

2 个答案:

答案 0 :(得分:0)

派生数据出现很多错误,我假设您升级了Xcode?

在Xcode中执行以下步骤:

  • 产品 - &gt; (按住Alt键) - &gt;清理构建文件夹
  • 产品 - &gt;清洁项目
  • 窗口 - &gt;组织者 - &gt;删除派生数据

然后再次构建您的项目。

答案 1 :(得分:0)

您在.h文件中声明了构造函数和比较函数。将它们移动到.cpp文件中,事情应该顺利进行。

更深入地了解正在发生的事情:

.h文件被复制粘贴到正在编译的每个对象中。因此main.o和UnsortedStruct.o将在预处理器时将头文件复制粘贴到其对象中。

您有两个对象,并在每个对象中定义:: Comparison和:: NFLPlayer函数实现。最终得到两个相同函数的实现,因此是重复的符号。

.h文件旨在为待使用的结构,类,函数提供定义(可以这么说是前向声明)。

实现主体在.cpp文件中实现,然后在编译后编译然后链接整个代码。

当你看到.h文件中的实现时,你会发现它们在类定义中:

Class A
{
   void foo() { // do something };
}

这是有效的,因为该函数将被内联。

但是,如果文件作为头文件包含在多个编译单元(对象)中,则声明void foo,然后在同一文件中将其实现为A :: foo()将会很麻烦。