C++ 链接器返回“;重新定位在符号索引处有无效符号…“;

C++ 链接器返回“;重新定位在符号索引处有无效符号…“;,c++,ubuntu,g++,C++,Ubuntu,G++,我正在Ubuntu上试用一些代码。我正在尝试运行以下代码 #包括 #包括 #包括 #包括“random.h” 使用名称空间std; /*功能原型*/ void initRandomSeed(); int随机整数(int低,int高){ initRandomSeed(); 双d=rand()/(双(rand_MAX)+1); 双s=d*(双(高)-低+1); 返回int(地板(低)+s); } 双随机实数(整数低,整数高){ initRandomSeed(); 双d=rand()/(双(rand_

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

#包括
#包括
#包括
#包括“random.h”
使用名称空间std;
/*功能原型*/
void initRandomSeed();
int随机整数(int低,int高){
initRandomSeed();
双d=rand()/(双(rand_MAX)+1);
双s=d*(双(高)-低+1);
返回int(地板(低)+s);
}
双随机实数(整数低,整数高){
initRandomSeed();
双d=rand()/(双(rand_MAX)+1);
双s=d*(双(高)-低+1);
返回低+s;
}    
布尔随机概率(双p){
initRandomSeed();

return randomReal(0,1)我不确定是否存在无效的重新定位错误,但明显缺少的是您没有
main
函数。您需要为应用程序定义一个名为
main
的入口点,该入口点在全局范围内定义,例如:

int main()
{
    // TODO: implementation
}
“未定义对“main”的引用”是因为您没有定义作为程序入口点的
main()
函数:

int main()
{
  // call other functions
}

有趣的是,如果我试图编译一个
.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++键入了错误的命令。您应该键入如下内容:

g++ file_name random.cpp

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

在使用CMake在gtest中链接并包含一个包含主函数的文件时,我遇到了同样的问题

所以,如果你确定你有一个main,并且你正在链接一些东西——确保你没有两个
intmain()
s


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

当我修复此问题时,重新定位错误似乎消失了,谢谢!即使定义了main,我也能得到此结果。那么错误意味着什么?@LennartRolland,这可能意味着您没有保存调用
main()的文件
。如果您最近才添加了main(),请尝试清理项目并重建它也许你的意思是g++-o file_name random.cpp因为你使用的是
g++
驱动程序,而不是直接使用后端编译器,所以这一点也不奇怪。驱动程序使用spec文件来找出如何按后缀处理文件。用任何库和
.h
文件试试,你会注意到它会掉一个
.h.gch
(预编译头)文件。因为这是您指示驱动程序要做的。上述错误是我第一次观察输入源代码的文件名,对“代码> G+++ <代码>的输出产生影响。我认为错误的原因既不明显也不令人惊讶。我高兴地不知道规格文件和编译器驱动程序,而且我从不知道。我以前知道这样的变幻莫测。虽然我认为错误的原因既不明显也不令人惊讶,但我从未相信或暗示行为是不正确的。同时,谢谢解释,即使它超出了我对<代码> G++的工作知识。