工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 2767|回复: 5

[TIPS] 编译c++代码的问题

[复制链接]
发表于 2008-4-3 00:13 | 显示全部楼层 |阅读模式
在编译c++代码的时候, 出理如下所示的错误:
[email=root@foo:/data/test1]root@foo:/data/test1[/email]# gcc -o test1 test1.cpp
/tmp/cc1fLADB.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status
[email=root@foo:/data/test1]root@foo:/data/test1[/email]#


为什么会这样呢?

gcc是GNU C Compiler,当我们的程序用到了c++对象时, 为了支持相应的c++库,我们应该使用g++编译器,
使用C编译器gcc去链接一个c++对象,会引发undefined reference错误. 比如上面所说的`__gxx_personality_v0'
发表于 2008-4-3 09:07 | 显示全部楼层
其实gcc也可以编译C++程序,只需要加个参数-lstdc++,它会通知gcc链接到C++库。
比如上面改成gcc -lstdc++ -o test1 test1.cpp就行了。
回复

使用道具 举报

 楼主| 发表于 2008-4-6 00:07 | 显示全部楼层
嗯.
楼上的方法也行.
回复

使用道具 举报

发表于 2008-4-27 20:27 | 显示全部楼层
http://help.ubuntu.org.cn/Gcchowto
噫,加上-lstdc++选项後,编译竟然通过了,而且没有任何警告。运行程序,结果如下:

$ ./hello
hello, world

通过上节,我们可以知道,-lstdc++ 选项用来通知链接器链接静态库 libstdc++.a。而从字面上可以看出,libstdc++.a 是C++ 的标准库,这样一来,上面的问题我们就不难理解了──编译 C++ 程序,需要链接 C++ 的函数库 libstdc++.a。

编译 C 的时候我们不需要指定 C 的函数库,为什幺 C++ 要指定呢?这是由于早期 gcc 是指 GNU 的 C 语言编译器(GNU C Compiler),随着 C++,Fortran 等语言的加入,gcc的含义才变化成了 GNU 编译器集合(GNU Compiler Collection)。C作为 gcc 的原生语言,故编译时不需额外的选项。

不过幸运的是,GCC 包含专门为 C++ 、Fortran 等语言的编译器前端。于是,上面的例子,我们可以直接用如下命令编译:

$ g++ -Wall hello.cpp -o hello

GCC 的 C++ 前端是 g++,而 Fortran 的情况则有点复杂:在 gcc-4.0 版本之前,Fortran 前端是 g77,而gcc-4.0之後的版本对应的 Fortran 前端则改为 gfortran。

从这里来看
g++ 应该是gcc的一个封装?
回复

使用道具 举报

发表于 2008-7-1 16:15 | 显示全部楼层
man下gcc发现一个有用的选项:  x
可以指定语言是c还是c++
回复

使用道具 举报

发表于 2008-7-1 16:26 | 显示全部楼层
学习了...~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-8-30 06:58

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表