C++ 链接器返回“重定位在符号索引处有一个无效符号......”
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10766256/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Linker returns "relocation has an invalid symbol at symbol index..."
提问by seeker
I am trying out some code on Ubuntu. I'm trying to run the following code
我正在 Ubuntu 上尝试一些代码。我正在尝试运行以下代码
#include <cstdlib>
#include <cmath>
#include <ctime>
#include "random.h"
using namespace std;
/* Function prototype! */
void initRandomSeed();
int randomInteger(int low,int high){
initRandomSeed();
double d= rand()/(double(RAND_MAX)+1);
double s= d*(double(high)-low+1);
return int(floor(low)+s);
}
double randomReal(int low,int high){
initRandomSeed();
double d=rand()/(double(RAND_MAX)+1);
double s=d*(double(high)-low+1);
return low+s;
}
bool randomChance(double p){
initRandomSeed();
return randomReal(0,1)<p;
}
void setRandomSeed(int seed){
initRandomSeed();
srand(seed);
}
void initRandomSeed(){
// to retain updated values across different stack frames! nice!
static bool initialized=false;
// this is executed only very first time and random value obtained from system clock!
if(!initialized){
srand(int(time(NULL)));
initialized=true;
}
}
And when I try to compile the above code using g++
, I get the following error
当我尝试使用编译上述代码时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
Any help or links to questions that help would be really helpful! Thanks!
任何有帮助的帮助或问题链接都会非常有帮助!谢谢!
回答by CB Bailey
I'm not sure about your invalid relocation errors but the obvious thing missing is that you have no main
function. You need to define an entry point to your application called main
, defined at global scope such as:
我不确定您的无效重定位错误,但明显缺少的是您没有main
功能。您需要定义一个名为 的应用程序入口点main
,在全局范围内定义,例如:
int main()
{
// TODO: implementation
}
回答by Attila
The "undefined reference to 'main'" is because you did not define a main()
function, which is the entry point of your program:
“对'main'的未定义引用”是因为你没有定义一个main()
函数,它是你程序的入口点:
int main()
{
// call other functions
}
回答by mpb
Interestingly, I get the same error if I try to compile a .h
file instead of a .c
file, and link against a library, all in one step.
有趣的是,如果我尝试编译一个.h
文件而不是一个.c
文件,并链接到一个库,我会得到同样的错误,所有这些都是一步完成。
Here is a greatly reduced example:
这是一个大大简化的示例:
$ 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
In this case, the solution is to rename the file to end with .c
:
在这种情况下,解决方案是将文件重命名为.c
:
$ echo 'int main () {}' > test.c
$ g++ test.c -ltommath && echo success
success
回答by Chase Holland
I just faced this same thing when linking in gtest with CMake and including a file that included a main function.
在 gtest 中与 CMake 链接并包含一个包含主函数的文件时,我只是遇到了同样的事情。
So, if you're sure you have a main, and you're linking something -- make sure you don't have two int main()
s!
所以,如果你确定你有一个 main,并且你正在链接一些东西——确保你没有两个int main()
s!
Simple solution was to split the main() into main.cpp and not link it with the test sources.
简单的解决方案是将 main() 拆分为 main.cpp,而不是将其与测试源链接。
回答by Chase Holland
You have typed wrong command for g++. You should have typed something like:
您为 g++ 键入了错误的命令。您应该输入如下内容:
g++ file_name random.cpp
You need to name output file. Otherwise it's like "g++ syntax error".
您需要命名输出文件。否则就像“g++ 语法错误”。