编译时出现“Undefined symbols for architecture x86_64”错误是什么意思?

52

我试图使用C++教科书中的邻接表示例编写一个图类,当我使用以下命令进行编译时:
g++ -o prog program.cpp
我得到了以下错误:

Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

...这到底是什么意思?可能是我的代码有问题,但我感觉问题可能比代码更深层次,因为我在许多不同的项目中都遇到了这个看似无法解释的错误,并且其中许多项目是以不同的方式解决的,不幸的是完全是偶然。

我在某个地方读到说这可能与我使用的是32位还是64位库有关,而且可能需要使用标记-m32或-m64,但我不确定是否适用于这里。有趣的是,当我尝试添加-m64标记时,我得到了完全相同的错误,但是当我尝试使用-m32标记时,我得到了同样的错误,只是它说

Undefined symbols for architecture i386:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

主要我只想知道这个错误在说什么。我通常习惯调试编译时指出具体代码行的错误,但是从这个错误信息中我无法辨别出任何类似那样的信息。您有什么思路吗?

如果有帮助的话,我使用一台2008年后期的Macbook,配有Intel Core 2 Duo(因此是64位),并运行OS X Lion(10.7.2),我认为这是最新版本。另外,我正在使用gcc版本4.2.1。


你的项目有.hpp文件吗?请参考https://dev59.com/fkrSa4cB1Zd3GeqPV2Jv - erturne
6
你的程序有main()函数吗? - springrider
我因为将main()命名为man()而犯了一个笔误。这是个愚蠢的错误,编辑器语言服务器也没有任何警告。 - jgnovak-dev
1个回答

63
当你编译文件时,编译器会调用链接器来尝试生成可执行文件。但是它无法成功,因为你没有提供一个名为main的函数,这个函数将在程序启动时被执行。
要么你不想运行链接器,因为你想单独编译多个文件然后合并它们。在这种情况下,使用-c标志告诉编译器跳过链接阶段。
要么你想执行已编译的文件。那么你需要实现main函数。

4
这个 -c 标志在哪些情况下会使用?你能举个例子吗? - JobHunter69
2
@Goldname 我能够在命令行终端中(我使用的是 Macbook 上的 Terminal)将 -c 标志传递给我的 C 编译器(gcc)。我在 CLI 中键入了以下内容:gcc -c myfilename.c - Richie Thomas
在我尝试使用Swift包管理器创建Swift包时,这篇文章帮了我很多。然而,Swift包管理器期望在目标目录中有一个名为main的文件。因此,如果您有一个名为“Foo”的可执行目标,则还应该有一个文件“Sources/Foo/main.swift”。 - aross
你为什么说OP没有提供main函数? - RobertS supports Monica Cellio
@RichieThomas 我在使用ld命令时遇到了这个问题。我该如何跳过它?在MacOSX中,ld没有-c选项。 - toytoy

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