首页 > 解决方案 > Xcode 链接器错误(重复符号),而 gcc 工作正常

问题描述

正如标题所说,在 Xcode 中编译 C 代码时(尝试了 9.4.1 版和 10.0 版 beta 6)我收到以下错误:

Ld /Users/dani/Library/Developer/Xcode/DerivedData/list-cqoddyqwcovrpqdkxxcsxeukjgbr/Build/Products/Debug/list normal x86_64 (in target: list)
cd /Users/dani/Documents/Prog/Name/list
export MACOSX_DEPLOYMENT_TARGET=10.13
/Users/dani/Downloads/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch x86_64 -isysroot /Users/dani/Downloads/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -L/Users/dani/Library/Developer/Xcode/DerivedData/list-cqoddyqwcovrpqdkxxcsxeukjgbr/Build/Products/Debug -F/Users/dani/Library/Developer/Xcode/DerivedData/list-cqoddyqwcovrpqdkxxcsxeukjgbr/Build/Products/Debug -filelist /Users/dani/Library/Developer/Xcode/DerivedData/list-cqoddyqwcovrpqdkxxcsxeukjgbr/Build/Intermediates.noindex/list.build/Debug/list.build/Objects-normal/x86_64/list.LinkFileList -mmacosx-version-min=10.13 -Xlinker -object_path_lto -Xlinker /Users/dani/Library/Developer/Xcode/DerivedData/list-cqoddyqwcovrpqdkxxcsxeukjgbr/Build/Intermediates.noindex/list.build/Debug/list.build/Objects-normal/x86_64/list_lto.o -Xlinker -export_dynamic -Xlinker -no_deduplicate -Xlinker -dependency_info -Xlinker /Users/dani/Library/Developer/Xcode/DerivedData/list-cqoddyqwcovrpqdkxxcsxeukjgbr/Build/Intermediates.noindex/list.build/Debug/list.build/Objects-normal/x86_64/list_dependency_info.dat -o /Users/dani/Library/Developer/Xcode/DerivedData/list-cqoddyqwcovrpqdkxxcsxeukjgbr/Build/Products/Debug/list

duplicate symbol _students in:
/Users/dani/Library/Developer/Xcode/DerivedData/list-cqoddyqwcovrpqdkxxcsxeukjgbr/Build/Intermediates.noindex/list.build/Debug/list.build/Objects-normal/x86_64/main.o
/Users/dani/Library/Developer/Xcode/DerivedData/list-cqoddyqwcovrpqdkxxcsxeukjgbr/Build/Intermediates.noindex/list.build/Debug/list.build/Objects-normal/x86_64/functions.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

使用 gcc 在终端中编译它时,我没有收到任何错误,并且程序按预期工作:

Daniels-MBP:Test dani$ gcc -Wall main.c functions.c -o prog Daniels-MBP:Test dani$ ls functions.c functions.h main.c prog view.csv

当我创建一个额外的functions.cfunctions.h文件时,错误首先出现(所以当我只有我的main.c文件时,我没有任何问题)。这是代码:

主程序

#include "functions.h"

int main(int argc, const char * argv[])
{
    int lineCounter = 0;

    char currentLine[STRINGLEN];

    FILE *fp;

    fp = fopen("view.csv", "r");

    //Namen aus File einlesen

    char *currentValue;

    while(fgets(currentLine, STRINGLEN, fp))
    {
        currentValue = strtok(currentLine, ";");
        strcpy(students[lineCounter].nachname, currentValue);

        currentValue = strtok(NULL, ";");
        strcpy(students[lineCounter].vorname, currentValue);

        currentValue = strtok(NULL, ";");
        strcpy(students[lineCounter].mtrkNr, currentValue);

        ++lineCounter;
    }

    selectWinner(students, lineCounter);

    return 0;
}

函数.c

#include "functions.h"

void selectWinner (struct student students[ROWS], int lineCounter)
{
    int randomNumber = 0;

    randomNumber = rand() % 45 + 1;

    srand((unsigned int)(time(NULL)));

    for (int currentIndex = 0; currentIndex < lineCounter; ++currentIndex)
    {
        printf("%s %s %s", students[currentIndex].vorname, students[currentIndex].nachname, students[currentIndex].mtrkNr);
    }

    printf("The winner is --> %s %s\n", students[randomNumber].vorname, students[randomNumber].nachname);
}

函数.h

#ifndef functions_h
#define functions_h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>

#define ROWS 50
#define STRINGLEN 40

struct student {
    char nachname[STRINGLEN];
    char vorname[STRINGLEN];
    char mtrkNr[STRINGLEN];
};

struct student students [ROWS];

void selectWinner (struct student students[ROWS], int lineCounter);

#endif /* functions_h */

关于可能的错误有什么建议吗?先感谢您!

标签: cxcodelinker-errors

解决方案


两个 .c 文件中都包含的 functions.h 中的行struct student students [ROWS];是导致链接器错误的原因。而是将该行移动到两个文件之一中。

正如@WhozCraig 提到的,将该行移到 main.c 的顶部,它将正确编译。


推荐阅读