gcc各个组件的功能请教~~

lofeng 2009-05-15 10:52:56
gcc各个组件的功能请教~~
只使用c/c++两种语言,涉及的组件有:

[QUOTE]
6.14.2. Contents of GCC
Installed programs:
c++, cc (link to gcc), cpp, g++, gcc, gccbug, and gcov

Installed libraries:
libgcc.a, libgcc_eh.a, libgcc_s.so, libmudflap.{a,so}, libssp.{a,so}, libstdc++.{a,so}, and libsupc++.a

Short Descriptions
c++
The C++ compiler
cc
The C compiler
cpp
The C preprocessor; it is used by the compiler to expand the #include, #define, and similar statements in the source files
g++
The C++ compiler
gcc
The C compiler
gccbug
A shell script used to help create useful bug reports
gcov
A coverage testing tool; it is used to analyze programs to determine where optimizations will have the most effect
libgcc
Contains run-time support for gcc
libmudflap
Contains routines that support GCC's bounds checking functionality
libssp
Contains routines supporting GCC's stack-smashing protection functionality
libstdc++
The standard C++ library
libsupc++
Provides supporting routines for the C++ programming language
[/QUOTE]

上面摘自LFS 6.4手册,参考论坛的http://www.linuxsir.org/bbs/showthread.php?t=152770帖子,大概知道了一些组件的作用:

c++        gcc的一个版本,默认语言设置为c++,而且在连续的时候自动包含标准c++库。这和g++一样 
ccl 实际的c编译程序
cclplus 实际的c++编译程序
collect2 在不使用GNU链接程序的系统上,有必要运行collect2来产生特定的全局初始化代码(例如c++的构造函数和析构函数)
g++ gcc的一个版本,默认语言设置为c++,而且在链接的时候自动包含标准c++库,这和c++一样
gcc 该驱动程序等同于执行编译程序和链接程序以产生必要的输出

libgcc 该库包含的例程被作为编译程序的一部分,是因为它们可被链接到实际的可执行程序中。它们是特殊的例程,链接到可执行程序,来执行基本的任务,例如浮点运算。这些库中的例程通常都是平台相关的。

libstdc++ 运行时库,包括定义为标准语言一部分的所有的c++类和函数

...全文
461 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lofeng 2009-05-22
  • 打赏
  • 举报
回复
顶起来 最近几天忙 差点忘了这个帖子~~
lingyin55 2009-05-15
  • 打赏
  • 举报
回复
要编辑可以要联系版主吧,不清楚。。

帖子收藏了。

[Quote=引用 3 楼 lofeng 的回复:]
怎么csdn没有办法编辑已发的帖子?
[/Quote]
lofeng 2009-05-15
  • 打赏
  • 举报
回复
怎么csdn没有办法编辑已发的帖子?
  • 打赏
  • 举报
回复
不错,收藏了。
lofeng 2009-05-15
  • 打赏
  • 举报
回复
从上面可以知道cc跟gcc一般都是一样的,因为cc是gcc的一个link
而cpp是预处理程序
但是c++跟g++有什么分别呢?这两个可是两个拷贝而不是link的


cc1才是实际的C编译程序
cc1plus是实际的C++编译程序
也就是说不管是gcc,还是g++/c++,都不能完成具体的编译工作,而是来调用其他工具来完成的编译的。
这样的话,使用gcc来编译程序时,gcc调用了哪些程序呢?调用的过程又是怎样的呢?是否是这样的:预处理程序cpp、编译程序cc1、连接器ld?
类似,使用g++/c++来编译程序时,g++/c++调用的程序和过程是否是这样的:预处理程序cpp、编译程序cc1plus、连接器ld?

gcc跟g++有什么分别得呢?gcc也可以来编译c++程序的
有看到gcc和g++的分别如下,不知可正确:
gcc和g++都是GNU(组织)的一个编译器。

误区一:gcc只能编译c代码,g++只能编译c++代码
两者都可以,但是请注意:
1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。C++的语法规则更加严谨一些。
2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。

误区二:gcc不会定义__cplusplus宏,而g++会
实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。

误区三:编译只能用gcc,链接只能用g++
严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。因为gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价。

gcc和g++的区别


我们在编译c/c++代码的时候,有人用gcc,有人用g++,于是各种说法都来了,譬如c代码用gcc,而c++代码用g++,或者说编译用gcc,链接用g++,一时也不知哪个说法正确,如果再遇上个extern "C",分歧就更多了,这里我想作个了结,毕竟知识的目的是令人更清醒,而不是更糊涂。

误区一:gcc只能编译c代码,g++只能编译c++代码

两者都可以,但是请注意:
1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的,例如:
#include <stdio.h>
int main(int argc, char* argv[]) {
if(argv == 0) return;
printString(argv);
return;
}
int printString(char* string) {
sprintf(string, "This is a test.\n");
}
如果按照C的语法规则,OK,没问题,但是,一旦把后缀改为cpp,立刻报三个错:“printString未定义”;
“cannot convert `char**' to `char*”;
”return-statement with no value“;
分别对应前面红色标注的部分。可见C++的语法规则更加严谨一些。
2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。

误区二:gcc不会定义__cplusplus宏,而g++会

实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。

误区三:编译只能用gcc,链接只能用g++

严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。因为gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价。

误区四:extern "C"与gcc/g++有关系

实际上并无关系,无论是gcc还是g++,用extern "c"时,都是以C的命名方式来为symbol命名,否则,都以c++方式命名。试验如下:
me.h:
extern "C" void CppPrintf(void);

me.cpp:
#include <iostream>
#include "me.h"
using namespace std;
void CppPrintf(void)
{
cout << "Hello\n";
}

test.cpp:
#include <stdlib.h>
#include <stdio.h>
#include "me.h"
int main(void)
{
CppPrintf();
return 0;
}

1. 先给me.h加上extern "C",看用gcc和g++命名有什么不同

[root@root G++]# g++ -S me.cpp
[root@root G++]# less me.s
.globl _Z9CppPrintfv //注意此函数的命名
.type CppPrintf, @function
[root@root GCC]# gcc -S me.cpp
[root@root GCC]# less me.s
.globl _Z9CppPrintfv //注意此函数的命名
.type CppPrintf, @function
完全相同!

2. 去掉me.h中extern "C",看用gcc和g++命名有什么不同

[root@root GCC]# gcc -S me.cpp
[root@root GCC]# less me.s
.globl _Z9CppPrintfv //注意此函数的命名
.type _Z9CppPrintfv, @function
[root@root G++]# g++ -S me.cpp
[root@root G++]# less me.s
.globl _Z9CppPrintfv //注意此函数的命名
.type _Z9CppPrintfv, @function
完全相同!
lofeng 2009-05-15
  • 打赏
  • 举报
回复
至于在linux下cross编译gcc 还没有尝试过
这个可以参考clfs手册
lofeng 2009-05-15
  • 打赏
  • 举报
回复
前几天开始在windows下编译mingw
由于不懂得地方太多 所以进度很慢
虽然参照别人的编译过程编译成功了 很多地方还不是很明白
还请多多指教
老邓 2009-05-15
  • 打赏
  • 举报
回复
很高手看到有共同兴趣的朋友!
我也在使用GCC编译器。
目前在反复尝试各种组合的编译方法。
不知道楼主可曾研究过GCC的编译?
Windows下编译MinGW?
Linux编译cross的GCC?
zhou_CC 2009-05-15
  • 打赏
  • 举报
回复
收藏

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧