共享库出现"undefined reference to main"错误

6
我正在尝试构建一个标准的共享库(使用Ubuntu上的code::blocks 13.12),显然它没有main函数,但在Windows上可以完美编译。我遇到了一堆重定位错误和未定义的main引用??

有什么建议吗?我已经粘贴下面的输出。

谢谢, Mike

-------------- Build: Debug in utils (compiler: GNU GCC Compiler)---------------

g++ -Wall -fexceptions -std=c++0x -g -fPIC -I -c utils/exception.cpp -o obj/Debug/exception.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.9/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status

我以前遇到过这个错误很多次,通常的解决方法是从项目中删除所有文件,在删除所有对象文件之前删除所有项目元数据,关闭code::blocks,重新打开code::blocks并递归地重新添加所有文件,这通常可以解决问题,但需要花费相当多的工作量。不用说,这是code::blocks的一个bug。但也有可能是你正在使用的库出现了错误。 - tom
1
它在CMake文件上运行良好,因此我怀疑是Code::Blocks。 - Mike
1个回答

12

你的链接命令缺少-shared标志,这是链接共享库所必需的。

不幸的是,你的构建系统没有打印失败的链接命令。

可以通过以下方式轻松重现此错误:

echo "int foo() { return 0; }" | gcc -xc -

/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
...
/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

我在链接器设置中添加了-shared标志,但没有成功。 - Mike
@Mike,“我添加...”——要么你将它添加到了错误的位置,要么错误已经改变。你的第一步应该是找出你正在执行什么实际链接命令。我99.9%确定它没有-shared - Employed Russian
2
我在code::blocks中遇到了一些困难,不知道在哪里添加这个。供下一个读者参考:它位于其他构建选项 -> 其他选项(在编译器标志的右侧)。 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接