我不会C++,没问题,跟凯哥一起学(一)

1、首当其冲,肯定就是要可以跑起来HelloWord.

网上源码一大堆,我找到了C++,HelloWord.c的demo,如何运行,这里就涉及到了编译器,那这里我来直接描述正题了。
C++编译器有很多,最常用并且免费的编译器是 GNU C/C++ 编译器,另外如果你有其他的操作系统,你也可以使用 HP 或者 Solaris 的编译器.这里介绍GCC编译器。什么是GCC?GCC是由GNU之父Stallman所开发的linux下的编译器,全称为GNU Compiler Collection, 目前可以编译的语言包括:C, C++, Objective-C, Fortran, Java, and Ada, 可以在其官方页面找到更加详细的信息什么是GCC?GCC是一个原本用于Unix-like系统下编程的编译器。不过,现在GCC也有了许多Win32下的移植版本。
这里我就直接告诉你MAC如何快速安装GCC编译器。常用的安装姿势有以下四种

  1. 通过port安装;
  2. Github安装。参考:https://github.com/kennethreitz/osx-gcc-installer;
  3. 通过手工方式安装,也是通过用终端实现的;
  4. 通过homebrew安装;

我们介绍第四种,也就是笔者最熟悉的那种啦,这里步骤如下:

1️⃣确认下是否安装过

g++ -v
如果出现下图,那就是代表该系统已经拥有了编译器。


我不会C++,没问题,跟凯哥一起学(一)_第1张图片
gcc安装成功示意图.png

2️⃣如果没有安装过,那mac下执行下面一行代码就直接一键安装Homebrew通过brew来一键安装GCC

1、执行ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2、执行brew install gcc
不了解什么是Homebrew请转见官方文档http://brew.sh/index_zh-cn.html安装完成后直接执行第二步就OK了。
接着在执行gcc -v ,或者g++ -v.出现上图就表示安装成功

3️⃣ 执行g++ hello.cpp

会生成一个a.out.

4️⃣直接执行./a.out. 会看到执行结果。

好了,我们现在步入主题,凯哥带你聊聊C编译器常用的gcc和g++
GCC:GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。
gcc是GCC中的GUN C Compiler(C 编译器)
g++是GCC中的GUN C++ Compiler(C++编译器)
一个有趣的事实就是,就本质而言,gcc和g++并不是编译器,也不是编译器的集合,它们只是一种驱动器,根据参数中要编译的文件的类型,调用对应的GUN编译器而已,更准确的说法是:gcc调用了C compiler,而g++调用了C++ compilergcc和g++的主要区别

  1. 对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)
  2. 对于 .c和.cpp文件,g++则统一当做cpp文件编译
  3. 使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL
  4. gcc在编译C文件时,可使用的预定义宏是比较少的
  5. gcc在编译cpp文件时/g++在编译c文件和cpp文件时(这时候gcc和g++调用的都是cpp文件的编译器),会加入一些额外的宏,这些宏如下:
    define GXX_WEAK 1
    define __cplusplus 1
    define __DEPRECATED 1
    define GNUG 4
    define __EXCEPTIONS 1
    define private_extern extern
  6. 在用gcc编译c++文件时,为了能够使用STL,需要加参数 –lstdc++ ,但这并不代表 gcc –lstdc++ 和 g++等价,它们的区别不仅仅是这些。

以上都是各处搜刮来的油脂,只是大致上帮助我们了解一二。

凯哥找到一篇很通俗易懂的文章在此分享,如有侵权请立即留言通知本人,本人会立即删除。原文:https://blog.csdn.net/bit_clearoff/article/details/53965514

我不会C++,没问题,跟凯哥一起学(一)_第2张图片
image.png

我不会C++,没问题,跟凯哥一起学(一)_第3张图片
文件后缀对应关系表.png

gcc和g++的流程是一致的分为:1、预处理;2、编译;3、汇编;4、链接。简要描述见上图。
上图介绍了相关指令和参数以及该条指令所做的对应的事情。

gcc -E filename.c -o filename.i
将c文件转化成C++文件,这个过程也叫做预处理过程
gcc -S filename.i -o filename.s
将预处理过程生成的.i后缀的文件转化成汇编文件,里面存储的是相应的汇编代码,这个过程叫做编译。
gcc -c filename.s -o filename.o
将汇编文件中的汇编代码翻译成相应的机器语言,这个过程叫做汇编。
gcc filename.o -o filename.exe
这条指令是完成链接这个过程的,它通过链接器ld将运行程序的目标文件和库文件链接在一起,生成最后的可执行文件
生成可执行文件后,我们就能够调用相应的程序了。
注意:由于g++和gcc的用法相同,所以在这里我们就不直接介绍了。生成过程如下图


我不会C++,没问题,跟凯哥一起学(一)_第4张图片
gcc编译过程.png

那gcc和g++区别我们可以执行看下么,凯哥就带你继续撸:

1、编译c程序

我不会C++,没问题,跟凯哥一起学(一)_第5张图片
.png

上图中,我们发现用gcc和g++分别编译hello.c这个c文件,发现都是可执行的,实际上对于C文件gcc和g++所做的事情确实是一样的,g++在编译C文件时调用了gcc.

2、编译C++程序

1、比较预处理阶段生成文件差异:
g++ -E hello.cpp -o helloC_.i
gcc -E hello.cpp -o helloC_.i


我不会C++,没问题,跟凯哥一起学(一)_第6张图片
1、预处理步骤.png

2 、比较编译阶段生成文件差异:
gcc -S helloC.i -o hello.s


我不会C++,没问题,跟凯哥一起学(一)_第7张图片
gcc编译c++代码.png

g++ -S helloC_.i -o hello.s
我不会C++,没问题,跟凯哥一起学(一)_第8张图片
g++编译c++文件顺利通过

这件事情说明gcc无法自动和c++的库文件进行连接,导致了库函数没有申明的错误
3、汇编

这个过程应该都没有问题,因为这个过程只是将后缀为.s文件中的汇编语言转换成了相应的机器语言。所以gcc和g++应该在这个过程中做了同样的事情。
4、链接
这个阶段也出现了问题,用gcc将.cpp后缀产生的.o文件转换成可执行文件时出现了错误,而g++却可以转换成功并且能够正确执行。这个还是因为gcc无法将库文件与.o后缀的文件关联在一起生成可执行程序,而g++可以完成这项工作。
总而言之,一句话,g++会自动链接标准库STL,而gcc不会自动链接STL。今天凯哥就带你们撸到这了,太晚了,明后天继续。

你可能感兴趣的:(我不会C++,没问题,跟凯哥一起学(一))