[TIPS] 编译c++代码的问题
在编译c++代码的时候, 出理如下所示的错误:root@foo:/data/test1# gcc -o test1 test1.cpp
/tmp/cc1fLADB.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status
root@foo:/data/test1#
为什么会这样呢?
gcc是GNU C Compiler,当我们的程序用到了c++对象时, 为了支持相应的c++库,我们应该使用g++编译器,
使用C编译器gcc去链接一个c++对象,会引发undefined reference错误. 比如上面所说的`__gxx_personality_v0' 其实gcc也可以编译C++程序,只需要加个参数-lstdc++,它会通知gcc链接到C++库。
比如上面改成gcc -lstdc++ -o test1 test1.cpp就行了。 嗯.
楼上的方法也行. 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的一个封装? man下gcc发现一个有用的选项:x
可以指定语言是c还是c++ 学习了...~
页:
[1]