简介:
gcc 与 g++ 分别是 gnu 的 c & c++ 编译器 ,gcc是c编译器,g++是c++编译器,C语言可以用gcc和g++生成可执行文件,c++只能用g++生成可执行文件。
编译器在执行编译时,总共需要4步:
- 预处理,生成 .i 的文件 [预处理器cpp]
- 将预处理后的文件转换成汇编语言, 生成文件 .s [编译器egcs]
- 有汇编变为目标代码(机器代码)生成 .o 的文件 [汇编器as]
- 连接目标代码, 生成可执行程序 [链接器ld]
gcc/g++常用的参数:
假设源文件名为hello.c
如果不加参数则输出a.out的可执行文件:
gcc hello.c
-o
制定目标名称,默认的时候,gcc编译出来的文件是a.out:
gcc hello.c -o hello
-E
只激活预处理,这个不生成文件:
gcc -E hello.c
后面跟-o可以输出文件:
gcc -E hello.c -o hello.i
-S
只激活预处理和编译,就是指把文件编译成为汇编代码:
gcc -S hello.c
#或
gcc -S hello.i
-c
只激活预处理,编译,和汇编,也就是他只把程序做成obj文件:
gcc -c hello.c
单个源文件生成可执行程序:
假设有一个名为 helloworld.cpp 的c++源文件:
#include <iostream>
int main()
{
std::cout << "hello, world" << std::endl;
return(0);
}
运行如下命令生成 helloworld 可执行文件:
g++ helloworld.cpp -o helloworld
运行该文件:
./helloworld
#输出 hello,world
程序 g++ 是将 gcc 默认语言设为 C++ 的一个特殊的版本,链接时它自动使用 C++ 标准库而不用 C 标准库。通过遵循源码的命名规范并指定对应库的名字,用 gcc 来编译链接 C++ 程序是可行的,如下例所示:
gcc helloworld.cpp -lstdc++ -o helloworld
选项 -l (ell) 通过添加前缀 lib 和后缀 .a 将跟随它的名字变换为库的名字 libstdc++.a。而后它在标准库路径中查找该库。gcc 的编译过程和输出文件与 g++ 是完全相同的。
在大多数系统中,GCC 安装时会安装一名为 c++ 的程序。如果被安装,它和 g++ 是等同,如下例所示,用法也一致:
c++ helloworld.cpp -o helloworld
多个源文件生成可执行文件
假设有以下三个文件,一个头文件和两个源文件:
/* speak.h */
#include <iostream>
class Speak
{
public:
void sayHello(const char *);
};
/* speak.cpp */
#include "speak.h"
void Speak::sayHello(const char *str)
{
std::cout << "Hello " << str << "\n";
}
/* hellospeak.cpp */
#include "speak.h"
int main(int argc,char *argv[])
{
Speak speak;
speak.sayHello("world");
return(0);
}
如果将多个源文件在g++ 中指定,则它们将被编译链接成一个可执行文件:
g++ hellospeak.cpp speak.cpp -o hellospeak
我们也可以将以上两个文件分别生成目标文件在链接成可执行文件:
g++ -c hellospeak.cpp
g++ -c speak.cpp
g++ hellospeak.o speak.o -o hellospeak
参考: