链接器返回“重定位在符号索引处有无效的符号...”


67

我正在Ubuntu上尝试一些代码。我正在尝试运行以下代码

当我尝试使用编译以上代码时g++,出现以下错误

@ubuntu:~/Chardway$ g++ random.cpp
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 10
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 11
/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 10
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 5 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 6 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 7 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 8 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 9 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 10 has invalid symbol index 11
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 11 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 12 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 13 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 14 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 15 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 16 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 17 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 18 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 19 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 20 has invalid symbol index 19
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status

任何帮助或指向帮助的问题的链接都将非常有帮助!谢谢!

Answers:


101

我不确定您的无效重定位错误,但显而易见的是缺少任何main功能。您需要为应用程序定义一个名为的入口点,该入口点main在全局范围内定义,例如:

int main()
{
    // TODO: implementation
}

重新定位错误似乎消失了,当我解决此问题时,谢谢!
搜寻者2012年

4
即使主定义也可以得到这个。那么错误意味着什么?
Lennart Rolland 2014年

1
@LennartRolland,这可能意味着您尚未保存调用的文件main()
gsamaras 2015年

如果您最近才添加过main(),请尝试清理您的项目并重建它
Mawg说恢复Monica 2015年

12

“对“ main”的未定义引用”是因为您没有定义main()函数,这是程序的入口点:

int main()
{
  // call other functions
}

8

有趣的是,如果我尝试一步编译一个.h文件而不是一个.c文件,并链接到一个库,则会遇到相同的错误。

这是一个大大简化的示例:

$ echo 'int main () {}' > test.h
$ g++ test.h -ltommath && echo success
/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

在这种情况下,解决方案是将文件重命名为以结尾.c

$ echo 'int main () {}' > test.c
$ g++ test.c -ltommath && echo success
success

由于您直接使用g++驱动程序而不是后端编译器,因此这一点也不奇怪。驱动程序使用规范文件来查找如何通过后缀来处理文件。尝试使用任何库和任何.h文件,您会发现它会丢弃.h.gch(预编译的头文件)文件。因为那是您指示驾驶员执行的操作。
0xC0000022L

上面的错误是我第一次观察到输入源代码的文件名对的输出有影响g++。我认为错误的原因既不明显也不令人惊讶。我非常高兴地不知道规格文件和编译器驱动程序,因此我以前从来不需要了解这些变化。尽管我认为错误的原因既不明显也不令人惊讶,但我从未相信也不暗示该行为是错误的。同时,感谢您的解释,即使它超出了我的知识g++
mpb

2

在gtest与CMake链接并包含一个包含主要功能的文件时,我只是遇到了同样的事情。

因此,如果您确定自己有一个main,并且正在链接某些东西,请确保没有两个int main()s!

一个简单的解决方案是将main()拆分为main.cpp,而不将其与测试源链接。


-4

您为g ++输入了错误的命令。您应该输入以下内容:

g++ file_name random.cpp

您需要命名输出文件。否则就像“ g ++语法错误”。


5
也许您的意思是g ++ -o file_name random.cpp
Bulletmagnet
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.