gcc“再简单不过”的程序产生了Undefined symbols for architecture x86_64编译错误

3
在发布这个问题之前,我已经阅读了数百页的谷歌搜索结果,但无法找到解决此问题的方法。我的程序非常简单-只有以下3个文件:
test.h
#ifndef SYMBOL
#define SYMBOL 

#include <stdio.h>

void output(void);

#endif      

test.c

#include "test.h"

void output(void)
{
  printf("%s\n", "Hello world");
}

untitled.c

#include <stdio.h>
#include "test.h"

void main()
{
  output();
  return;
}

我使用终端并输入以下命令进行编译:

gcc -o aaa untitled.c

输出应该打印“Hello world”,但实际上它一直抛出这个错误:
Undefined symbols for architecture x86_64:
  "_output", referenced from:
      _main in untitled-00f904.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我花了整整一天的时间寻找解决方案,尝试了所有可能的建议,但没有一个有效。

有一个值得注意的地方:如果我更改 untitled.c 中包含的文件 (#include "test.h" 变成 #include "test.c"),编译器就可以正常工作。

请问有人能够解释为什么会这样,并说明如何解决吗?


使用gcc -Wall -g -v进行编译,以了解正在发生的情况。使用gcc -v检查您的gcc是否符合您的预期。 - Basile Starynkevitch
我没有Mac(而且我讨厌它们),但我相信这是一个常见的系统管理员问题。 - Basile Starynkevitch
我的(挑衅性的)建议是:摆脱MacOSX,安装Linux操作系统到您的电脑上。 - Basile Starynkevitch
是的,好主意。再也不用运行体面的软件了...哦等等... - trojanfoe
注意C和C++中main()函数应该返回什么——非Microsoft系统的答案是int - Jonathan Leffler
显示剩余3条评论
1个回答

4

您需要将两个源文件编译并链接到可执行文件中;链接器告诉您它找不到在test.c中定义的output()函数:

$ gcc -o aaa untitled.c test.c

嘿,非常感谢你,你救了我浪费数天时间的命运 :D - Merkurial
顺便说一下,我看到其他平台上的gcc可以自动链接头文件进行编译,这意味着只需要使用"gcc -o aaa untitled.c"就可以自动编译test.c了。 输入所有源文件进行编译可能会很麻烦,有没有一种快捷方式可以避免为编译器输入所有源文件? - Merkurial
@Merkurial 我不相信那是真的,也从未遇到过。没有人喜欢在命令行上输入这些东西,大家都会使用构建系统,最常见的是 make。构建系统将在源文件更改时自动编译和链接所需的内容。还有其他构建系统;例如 scons。或者放弃命令行,开始使用 Xcode 进行工作;它完全免费,并且是我在任何平台上使用过的最好的 IDE,包括 Visual Studio。 - trojanfoe
谢谢你的回答:D 它帮了我很多:D - Merkurial

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接