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