【问题标题】:Xcode linker command failed issueXcode 链接器命令失败问题
【发布时间】:2014-10-08 12:54:57
【问题描述】:
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;
}

【问题讨论】:

  • 你有一个重复的符号错误,这基本上意味着你在多个地方声明了同一个对象。请在声明“玩家”的地方添加您的代码示例(来自 main / UnsortedStruct)。尽可能短代码 sn-ps。
  • @MichaelCMS 我已经添加了我的客户端代码和我的 UnsortedStruct 文件
  • 问题可能出在 NFL.h 中。您是否确保只包含一次(pragma once / ifndef 方法)?除了函数原型和外部/类变量之外,您是否在 NFL.h 中实现/声明了任何内容?
  • @MichaelCMS 是的,我声明了一个枚举类型(我已经用 NFl.h 文件替换了我的主代码)并定义了它。我想我可能对你可以用头文件做什么有误解,所以我定义的函数可能会导致错误。
  • 我能想到的可能原因:NFL成员的实现在“NFL.h”但没有内联,或者你已经包含了一个“.cpp”文件在某处。

标签: c++ xcode debugging linker


【解决方案1】:

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

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

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

您有两个对象,在每个对象中定义 ::Compared 和 ::NFLPlayer 函数实现。你最终会得到同一个函数的两个实现,因此会出现重复的符号。

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

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

当您在 .h 文件中看到实现时,您会看到这些在类定义中:

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

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

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

【讨论】:

  • 谢谢。我明白现在发生了什么。我重新设计了我的程序的那一部分,它现在可以工作了。谢谢!
【解决方案2】:

大量来自派生数据的错误,我假设您升级了 Xcode?​​p>

在 Xcode 中执行以下步骤:

  • 产品 -->(按住 Alt 键)--> 清理构建文件夹
  • 产品 --> 清洁项目
  • 窗口 --> 管理器 --> 删除派生数据

然后再次构建您的项目。

【讨论】:

  • 我没有升级 xcode。我已经返回并从我的代码中添加了两个文件,以了解我正在做的事情。
猜你喜欢
  • 2016-10-18
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多