免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 29590 | 回复: 17
打印 上一主题 下一主题

为什么gcc编译cpp程序总是需要加上-lstdc++ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-19 22:35 |只看该作者 |倒序浏览
10可用积分
如题,一个最简单的helloworld程序:
$ cat test.cpp
#include<stdio.h>
int main(void){
printf("hw!\n" ) ;
}
编译不通过
gcc test.cpp
/tmp/ccenMpAZ.o: (.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: ld 返回 1
我必须得gcc test.cpp -lstdc++才行,gcc test.cpp -lc都不行

但是如果我mv test.cpp test.c然后gcc test.c就没问题了!

这是为什么呢? printf明明是c运行时库的内容, 为何.cpp的时候就得-lstdc++?
环境: centOS5.2 gcc 4.1.2 , 相同的程序在solaris8+gcc2.95.2下面就不存在这个问题。

难道是编译器版本不同导致的么? 还是别的什么原因呢?
大虾指点,10分感谢!

最佳答案

查看完整内容

gcc 是根据源文件的后缀来确定源码所使用的语言以及默认要链接的库的,这个可以用 -v 看到。有。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2009-02-19 22:36 |只看该作者
原帖由 jeanlove 于 2009-2-20 10:37 发表

谢谢,gcc x.cpp -lc为什么不行呢? 它里面也有printf吧!

gcc 是根据源文件的后缀来确定源码所使用的语言以及默认要链接的库的,这个可以用 -v 看到。

这个必须加上-lstdc++的问题只在我的centOS linux5.2上存在,我在其他的平台,例如solaris上面编译,就不用增加-lstdc++选项都可以的。这个和平台和gcc的版本有关系么?

有。

论坛徽章:
0
3 [报告]
发表于 2009-02-19 22:43 |只看该作者
不是吧,这么巧!
昨天我也发现这样的问题,后来发现原来是自己太菜。
c程序源代码后缀为.c,用gcc来编译。
c++程序源代码后缀为.cpp,用g++来编译。

论坛徽章:
0
4 [报告]
发表于 2009-02-19 22:55 |只看该作者
cpp 一般是用 g++ 来编译吧。

论坛徽章:
0
5 [报告]
发表于 2009-02-19 23:52 |只看该作者
file.c
           C source code which must be preprocessed.

file.cc
       file.cp
       file.cxx
       file.cpp
       file.CPP
       file.c++
       file.C
           C++ source code which must be preprocessed.  Note that in .cxx, the
           last two letters must both be literally x.  Likewise, .C refers to
           a literal capital C.

论坛徽章:
0
6 [报告]
发表于 2009-02-20 00:32 |只看该作者

回复 #1 jeanlove 的帖子

编译C++程序当然是用到了C++的库。所以需要加上-lstdc++。

论坛徽章:
0
7 [报告]
发表于 2009-02-20 09:49 |只看该作者
原帖由 scutan 于 2009-2-20 00:32 发表
编译C++程序当然是用到了C++的库。所以需要加上-lstdc++。


说明一下, -l 后面加的是动态库libstdc++.-l加的时候,把"lib"三个字符省略,例如链接librt.so.6.你就需要加 -lrt ,依此类推。如果你安装了的话,你可以在/lib/下面找到

论坛徽章:
0
8 [报告]
发表于 2009-02-20 09:57 |只看该作者
谢谢,可是我的helloworld里面并没有包含任何c++的元素啊,只是后缀名是cpp而已,gcc也能编译的: 如果我去掉printf的调用,gcc编译就不需要增加-lstdc++

为什么调用c运行库也得-lstdc++呢? 很奇怪!

论坛徽章:
0
9 [报告]
发表于 2009-02-20 10:34 |只看该作者
既然是cpp的文件,就需要链接c++的库,当你去掉printf的时候,程序不需要链接任何库就可以编译过去,所以没什么问题。
libstdc++中也有定义printf();

论坛徽章:
0
10 [报告]
发表于 2009-02-20 10:37 |只看该作者
原帖由 liying_gg 于 2009-2-20 10:34 发表
既然是cpp的文件,就需要链接c++的库,当你去掉printf的时候,程序不需要链接任何库就可以编译过去,所以没什么问题。
libstdc++中也有定义printf();

谢谢,gcc x.cpp -lc为什么不行呢? 它里面也有printf吧!

而且,这个必须加上-lstdc++的问题只在我的centOS linux5.2上存在,我在其他的平台,例如solaris上面编译,就不用增加-lstdc++选项都可以的。这个和平台和gcc的版本有关系么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP