浅谈gcc和g++的相同点与不同点

一、以前我总以为gcc只能编译c文件,g++只能编译cpp文件,今天从网上查了一些资料才发现以前对gcc和g++一点都不了解,我相信肯定也有跟我一样对这个不了解的人,今天在这里对网上的一些信息做个总结,方便后来者

  • g++和gcc都可以用来编译链接.c文件和.cpp文件
    • 对于.c文件,gcc把它当作c程序,g++则会把它当作c++程序;对于.c++文件,gcc和g++都会把它当作c++程序
    • 在编译阶段,gcc和g++是相同的,都是使用gcc编译(g++会调用gcc)
    • 在链接阶段,gcc因无法自动链接c++的函数库,如果想要链接C++的函数库,就需要手动指定,命令为gcc xxx.cpp -lstdc++ -o xxx。但g++会自动链接C++的库函数。为简便,对.cpp文件直接使用g++进行编译和链接(其实编译还是使用的gcc)
  • extern "C"与gcc/g++没有关系
    • 使用extern "C"时就是将.cpp文件以C的命名方式来为symbol命名,否则以C++的方式命名

二、gcc/g++对程序编译链接生成可执行文件的过程

源程序:hello.cpp

#include <iostream>
using namespace std;

int main()
{
     cout << "hello,world" << endl;
     return 0;
}
1.预处理阶段

    对头文件和宏定义进行替换,同时也会语法检查,由于对头文件进行了替换,因此会导致编译所得到的文件特别大,因此对不需要的头文件就不要包含在程序中

    命令为:g++ -E hello.cpp -o hello.i

2.生成汇编文件

   对预处理得到的文件进行汇编生成汇编文件

   命令为:g++ -S  hello.i -o hello.s

3.生成目标文件

   由汇编文件得到目标文件

   命令为:g++ -c hello.s -o hello.o

4.链接目标文件和库函数文件,得到可执行文件

   在链接阶段除了需要目标文件之后,可能还会需要库文件,包括静态库文件和动态库文件

   命令为:g++ hello.o -o hello  (这里没有添加库文件)


三、linux中的静态库文件和动态库文件

库是一组已经写好了的函数和变量,是经过编译了的代码。库分为静态库和动态库,静态库是在程序进行链接的时候,将库拷贝到目标程序中,当目标程序生成的时候,程序就可以脱离库文件运行,也就是当目标程序已生成之后就可以将库删除。动态库也叫共享库,是被多个应用程序所共享的,是在程序运行的时候进行动态的加载,因此对于每个程序来说,当其不使用某个共享库时,不能将该库删除,因为该库可以还有其他程序在用

 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值