第一章 预备知识
-
知识点提炼
1. C语言 -----> 结构化编程
C++ -----> 面向对象编程
2. C++系统中编程步骤:
3. linux编译和链接
① linux系统中最常用的编译器是g++,这是来自Free Software Foundation的GNU C++编译器。linux的多数版本都包含该编译器,但并不一定总是安装它。g++编译器的工作方式很像标准UNIX编译器:
g++ spiffy.cxx --------->这将生成一个可执行文件a.out
有些版本可能要求链接C++库:g++ spiffy.cxx -lg++
要编译多个源文件,只需将他们全部放到命令行中即可:g++ my.cxx precious.cxx -------->这将生成一个可执行文件a.out和两个目标文件my.o和precious.o。
如果接下来修改了其中的某个源代码文件,如my.cxx,则使用my.cxx和precious.o来重新编译:g++ my.cxx precious.o
② 另一个可能的选择是Comeau C++编译器(www.comeaucomputing.com),它要求使用GNU编译器。然而,Comeau编译器提供了最完备、最严格的C++ 标准实现。
GNU编译器可以在很多平台上使用,包括基于Windows的PC和在各种平台上运行的Unix系统。
4. Windows命令行编译器
5.Windows编译器
问题:
头文件和库文件的区别?
答:为什么我会有这个问题,原因是书中提到C++程序在真正编译前会在编译前做一个预处理工作,比如我们在开始使用#include <iostream>,那么就会将头文件替换指令位置,然后进行编译生成 .s,汇编生成 .o文件,那么接下来进行链接的时候,根据最上面的那张图,会将库文件和启动程序都加载进来,我的疑惑就在这里,为什么又把程序加载进来,不是已经在预处理阶段已经把程序放进来了吗?
接下来,我看了两篇博客也分享给大家:
C/C++中的源文件与头文件的区别:https://www.cnblogs.com/superpig0501/p/3967578.html
linux下的库文件:http://blog.csdn.net/high_high/article/details/7193264
然后来摘取其中比较关注的问题:
1. 预处理器发现#include指令后,就会寻找指令后面的文件名并把这个文件的内容包含到当前文件中。被包含文件中的文本将替换源代码文件中的#include指令,就像你把被包含文件中的全部内容键入到源文件中的这个位置一样。头文件是没有编译意义的,编译器只编译源文件生成目标文件,而头文件不参与编译过程。
2. 一般从C源文件到可执行代码要经过以下4个步骤:预编译(preprocess gcc -E,生成.i文件),编译(compile gcc -S,生成.s文件),汇编(assemble gcc -c,生成.o文件),链接(link 生成可执行文件)。这里只讨论最后两个步骤,汇编和链接。汇编后的结果是每个源文件都有了对应的二进制代码;链接是把所有的二进制代码打包成一个文件,最后得到可执行文件。
结合文中的例子,我们再来试着梳理一下,一个源代码在进行预处理的时候,将#include <iostream>被相应的头文件中的代码替换掉,然后经历编译,此时会检查语法规则,比如程序中使用到了cout函数,虽然当前的源代码中没有cout函数的实现,但是这不要紧,因为可以肯定这个cout函数是存在的,可以放心使用,而且告诉了main这个cout该怎么用,参数是什么,返回值是什么等相关信息。虽然我们将cout对应的函数加载到了源程序中,但是头文件是没有编译意义的,编译器只编译源文件生成目标文件,而头文件不参与编译过程。经过了编译,源程序生成了.s文件,再经历汇编生成一个对应的二进制文件.o,那么这个二进制文件就基本上可以认为是一个库文件的雏形了。然后根据后一篇博文了解到动态链接库和静态链接库。然后在链接的时候选择将库文件的二进制代码和启动程序的二进制代码加上源程序生成的二进制文件打包成一个可执行文件。
也可以发现头文件不是库文件,但库文件可以是头文件。
ps:参考书籍《c++ primer》,因为没有系统学过过c++这门课程,所以想更系统的去学习一下。之后如果学习中有什么有意思的地方,我也会敲一些例子来加深理解。ヾ(◍°∇°◍)ノ゙自己对于知识的理解可能也不是特别到位,如果有什么讲的不清楚、不明白亦或是存在问题的地方,欢迎大家交流指正(diss就免了吧喵)ヾ(◍°∇°◍)ノ゙