【问题标题】:undefined reference to main in code blocks代码块中对 main 的未定义引用
【发布时间】:2015-02-25 08:35:08
【问题描述】:

一些背景故事:我第一次使用 Eclipse,但它在解析命名空间 std 时遇到了问题,所以我切换到 code::blocks,现在我遇到了这个问题。

除一个错误外,一切都顺利通过了调试:在函数“_start”中:未定义对“main”的引用 (.text+0x20)。但是,我定义了 main() 并且没有什么花哨的东西。

code::blocks 版本:13.12 编译器:GNU gcc,让 g++ 跟随 c++11

提前致谢。

主函数没什么特别的

//: "main.cpp"
#include "bar.h"
#include "foo.h"
#include <iostream>
using namespace std;

int main() {
    int num;
    bar bar_;
    foo foo_;
    num = calc(bar_, foo_);
    cout << num << endl;
    return 0;
}

这是构建日志:

g++  -o bin/Debug/test obj/Debug/bar.o obj/Debug/foo.o   
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 4 has invalid symbol index 11
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 5 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 6 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 7 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 8 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 9 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 10 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 11 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 12 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 13 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 14 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 15 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 16 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 17 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 18 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 19 has invalid symbol index 21
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line): relocation 0 has invalid symbol index 2
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
1 error(s), 0 warning(s) (0 minute(s), 0 second(s))

【问题讨论】:

  • 你定义main()了吗?
  • 如果我们有办法查看相关代码就好了。这不是一个有用的功能吗? :-)
  • 你已经向我们展示了链接,你用什么编译对象!
  • 你问的是编译器吗?它是问题中所说的 gcc。
  • 您是否尝试过对包含 main 的文件使用相同的编译器? (当然,您必须将 cout 替换为任何 printf 系列函数,例如 printf("%d \n",num); )使用 #include &lt;stdio.h&gt;

标签: c++ c++11 codeblocks undefined-reference


【解决方案1】:

嗯嗯..

根据代码块网站,当出现此类错误时,

“不要看 Build Message 选项卡,看 Build log 选项卡”

就我而言: 它显示了链接器中缺少的一个 .so 文件。

这里是快速解决方案:

设置>>编译器>>链接器设置选项卡>>添加.so文件的路径(在构建日志中指出)

只需确保要添加的 .so 确实存在于您的系统中。

希望这会有所帮助。干杯。

【讨论】:

    【解决方案2】:
    1. cout &lt;&lt; &lt;&lt; num &lt;&lt; endl; 无效(注意两个重复的&lt;&lt;)。这意味着您的 main.cpp 甚至不应该编译。
    2. 在您的链接命令中,您没有链接main.omain.cpp 的编译目标文件)。您正在链接 foo.obar.o,但您缺少 main.o

    你需要如何解决这个问题:

    1. main.cpp 中修复您的代码
    2. 编译main.cpp得到目标文件main.o
    3. 所有对象文件链接在一起。

    【讨论】:

    • 第一个是错字,固定为2和3,我直接在code::blocks中使用了'build',怎么没有链接'main.o'?
    • @Siphenx:为了将来参考,您应该在问题中包含您的 exact 代码(不是重新输入,而是复制“n”粘贴)。这是提供良好 MVCE 的一部分。
    • main.cpp 是您项目的一部分吗?自从我使用 Code::Blocks 以来已经有好几年了,所以我帮不上什么忙。
    • 是的,它是一个小项目的一部分。另外,关于复制 n 粘贴代码,有没有办法让整个块一次成为代码,而不是手动缩进每一行?
    • 当您输入问题/答案时,会有一个如下所示的按钮:{}。如果您选择您的代码并单击该按钮,它将自动在每行的开头添加 4 个空格,以便将其格式化为代码。
    猜你喜欢
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 2012-01-27
    相关资源
    最近更新 更多