编译时错误“架构 x86_64 的未定义符号”是啥意思?

Posted

技术标签:

【中文标题】编译时错误“架构 x86_64 的未定义符号”是啥意思?【英文标题】:What does the compile-time error "Undefined symbols for architecture x86_64" mean?编译时错误“架构 x86_64 的未定义符号”是什么意思? 【发布时间】:2012-01-16 09:38:14 【问题描述】:

我正在尝试使用我的 C++ 教科书中示例中的相邻列表来编写图形类,并且当我使用此命令进行编译时: 代码: g++ -o prog 程序.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 年末的配备 Intel Core 2 Duo(64 位)的 Macbook,并且我正在运行我认为是最新版本的 OS X Lion (10.7.2)。另外,我使用的是 gcc 版本 4.2.1。

【问题讨论】:

您的项目是否有 .hpp 文件?见***.com/questions/1757509/… 你的程序有main()函数吗? 我是从将 main() 命名为 man() 的拼写错误中得到的。愚蠢的错误,编辑器语言服务器也没有任何警告。 【参考方案1】:

当您编译文件时,编译器会调用链接器来尝试生成可执行文件。但它不能,因为您没有提供名为main 的函数,该函数将在您的程序启动时执行。

您不想运行链接器,因为您想分别编译几个文件然后合并。在这种情况下,使用-c 标志告诉编译器跳过链接阶段。

或者您想要执行编译后的文件。然后你需要实现函数main

【讨论】:

你会在哪里使用这个 -c 标志?能举个例子吗? @Goldname 我能够在我的命令行终端中将 -c 标志传递给我的 C 编译器 (gcc)(我在 Macbook 上并且正在使用终端)。我在 CLI 中输入了以下内容:gcc -c myfilename.c 在我尝试使用 swift 包管理器创建 Swift 包时帮助了我很多。然而。 Swift 包管理器在目标目录中需要一个名为 main 的文件。因此,如果您有一个名为Foo 的可执行目标,您还应该有一个文件Sources/Foo/main.swift 是什么让你说OP没有提供main功能? @RichieThomas 我使用ld 命令遇到了这个问题。我该如何跳过这个? ld 在 MacOSX 中没有 -c 选项

以上是关于编译时错误“架构 x86_64 的未定义符号”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

架构 x86_64 的未定义符号:MqtUtil

终端中的“架构 x86_64 的未定义符号”,但 xcode 中没有错误

MATLAB:mex-compile 上缺少框架 – 架构 x86_64 的未定义符号

切换到调试时架构 x86_64 的未定义符号

gtest:架构 x86_64 的未定义符号与 clang++ 和 std::vector 错误

架构 x86_64 的未定义符号:编译问题