c - 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.c和functions.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 */
关于可能的错误有什么建议吗?先感谢您!
解决方案
两个 .c 文件中都包含的 functions.h 中的行struct student students [ROWS];
是导致链接器错误的原因。而是将该行移动到两个文件之一中。
正如@WhozCraig 提到的,将该行移到 main.c 的顶部,它将正确编译。
推荐阅读
- coq - 在 then 部分 coq 中使用 if expression = true 的证明
- html - 字体标签的 style="cursor:pointer" 在 Chrome 中有效,但在 IE 或 Edge 中无效
- azure - Spring Boot微服务(Rest Api)作为azure函数-Azure函数+spring rest微服务
- mysql - 服务 MySql@server-ip:3306 的 MySql 密码
- reactjs - 使用 apollo graphql 对 firebase 身份验证做出反应
- git - 如何从 Sourcetree github 项目中删除提交
- python - 将 pipenv 与 gitlab ci 一起使用
- python - 我有一个 python cgi 脚本,我想将每一行的状态或退出代码存储在一个文本文件中?
- python-2.7 - Python 中的 Flask-Ask 自定义 Alexa 技能
- c++ - QSyntaxHighlighter 和多行注释