Xcode 链接器命令失败问题

Xcode linker command failed issue

本文关键字:失败 问题 命令 链接 Xcode      更新时间:2023-10-16
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;
}

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

对正在发生的事情的更多见解:

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

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

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

实现

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

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

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

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

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

派生数据中有很多错误,我假设你对 Xcode 进行了升级?

在 Xcode 中执行以下步骤:

  • 产品 --> (按住 Alt 键( --> 清理构建文件夹
  • 产品展示 --> 洁净工程
  • 窗口 -->管理器 --> 删除派生数据

然后再次生成项目。