2013-07-27 36 views
1

意外地,我用-shared标志与hello world C++程序链接并获得了exe文件。但运行时输出是段错误。有人能告诉我背后的原因吗?C++共享标志段错误

的方式重现:在日食ç

标准C++的hello world问题++。 在设置 - >共享库设置中检查共享标志框。

构建输出:

使所有 建筑文件:../app.cpp 调用:GCC C++编译器 克++ -O0 -g3 -Wall -c -fmessage长度= 0 -fPIC -MMD - MP -MF “app.d” -MT “app.d” -o “app.o” “../app.cpp” 建好:../app.cpp

建设目标:应用程序调用 :GCC C++ Linker g ++ -shared -o“app”./app.o
完成建筑物目标:应用程序

执行输出: 分段故障

由于

+0

您已构建共享库,而不是可执行文件。尝试执行共享库通常会导致分段错误。除非你想建立一个共享库,否则不要使用'-shared'。 –

+0

你能告诉我为什么执行共享库会导致segFault?谢谢 – cppython

+0

@cppython共享库不需要入口点(函数main),因此系统无法知道从代码开始执行的位置。此外,C运行时代码中的可执行链接调用main(),如果main()返回,则调用exit()。 –

回答

5

选自G ++手册: --shared 生产,然后可以与其它对象连接以形成可执行的共享对象。并非所有系统都支持此选项。对于可预测的结果,您还必须指定用于在指定此选项时用于生成代码的相同选项集(-fpic,-fPIC或模型子选项)。

当你放上--shared选项时,这意味着你不想要一个可执行文件,而是一个共享对象。

你的情况,你创建一个共享库,而不是一个可执行文件。这就是为什么你在启动时发生段错误。

+0

因此,我必须添加-shared标志来构建(.so或.dll)文件。对? – cppython

+0

.so和.dll文件都是共享库。 .so在unix下使用,而.dll在Windows上使用。 – Joyas