我正在尝试自学一些 C,但我几乎立刻就陷入了 xCode 的困境。目前我的文件夹结构如下所示:
main.c 看起来像这样:
#include <stdio.h>
int main(void)
{
int dogs;
printf("How many dogs do you have?\n");
scanf("%d", &dogs);
printf("So you have %d dog(s)! \n", dogs);
return 0;
}
concrete.c 看起来像这样:
#include <stdio.h>
int main(void)
{
printf("Concrete contains gravel and cement.\n");
return 0;
}
无论我通过“产品”->“运行”运行哪一个,我都会遇到相同的错误:
有什么想法造成这种情况吗?仅来自 Python 背景,因此这些错误和 xCode 对我来说都是全新的
编辑-删除crete.c文件解决了这个问题,但这对我来说似乎不合理。是因为我有 2 个带有 int main(void) 的文件吗?
最佳答案
当您单击 Xcode 显示的“链接器命令失败,退出代码 1”时,它应该向您显示构建日志中链接器显示消息并以代码 1 退出的部分。
这些消息包括:
duplicate symbol _main in: [Some path on your system…]/Build/Intermediates.noindex/foo.build/Debug/foo.build/Objects-normal/x86_64/foo.o [Some path on your system…]/Build/Intermediates.noindex/foo.build/Debug/foo.build/Objects-normal/x86_64/main.o ld: 1 duplicate symbol for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
该消息“duplicate symbol _main”告诉您问题:您有两个 main
定义。 main
是为启动程序而调用的唯一例程的名称,您应该只有一个定义。
补充
默认情况下,在 C 语言中,函数名称具有外部链接,这意味着不同翻译单元(正常使用时的源文件)中的相同名称引用相同的事物。因此,不能有两个函数具有相同的名称(任何名称,而不仅仅是 main
),因为这样您就有了两个具有相同名称的东西。您可以通过使用静态声明来给函数提供内部链接而不是外部链接,这样该名称就不会与其他翻译单元中的相同名称发生冲突。
尽管如此,定义 main
的 static
版本可能会导致编译器提示,因为 main
不应该用 static 声明
并且应该声明它返回 int
(如果您以其他方式声明它)。这些源自 C 标准中的文本,位于 C 2018 5.1.2.2.1 1:
The function called at program startup is named
main
. The implementation declares no prototype for this function. It shall be defined with a return type ofint
and with no parameters: … or with two parameters (referred to here asargc
andargv
, though any names may be used, as they are local to the function in which they are declared): …
尽管该文本限制了 main
的声明,但在我看来,它可以被解释为引用具有外部链接的 main
,而不是发生的任何例程被声明为main
。尽管如此,将众所周知的特殊用途名称重复用于其他目的通常是不好的做法。
关于c - 如何诊断 Xcode 消息 “Linker command failed with exit code 1” ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54848214/