大多数人学习C/C++都是从语法什么的开始学习,只学习如何写代码(我最开始也是),但是时间长了之后会发现,对于一些相对底层的实现一无所知,甚至有一些在我看来比较常识性的问题也一知半解。其实很大程度上是因为,像我这种是没有系统学习过计算机的,一些本应该并行的基础课没有上,所以,这个系列,单独讲一讲我所遇到的,以及我认为会遇到的关于C的“基础概念”
C程序编译步骤
C程序的编译四步
C代码编译成可执行程序经过4步: 1)预处理:宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法 2)编译:检查语法,将预处理后文件编译生成汇编文件 3)汇编:将汇编文件生成目标文件(二进制文件) 4)链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去
gcc编译过程
上面的四步很多人都没有什么概念,非计算机专业可能只记得编译和链接,下面通过gcc来演示一下每个过程是做什么的。关于gcc的安装,看这里喽
分步编译
预处理:gcc -E hello.c -o hello.i
编 译:gcc -S hello.i -o hello.s
汇 编:gcc -c hello.s -o hello.o
链 接:gcc hello.o -o hello
下面来演示一下这个过程 首先选择一个c文件
- 预处理 gcc -E 01.c -o 01.i
成功后我们会得到一个.i文件,我们先来看一下原始的.c文件,先不管它实现的功能,看长度他只有47行 但是.i文件有上千行,宏定义、头文件都被展开了,而且可以看到注释掉的代码被删除了 - 编译 gcc -S 01.i -o 01.s
现在我们得到了一个.s文件,同样用记事本打开,熟悉汇编的会看到,这里有很多汇编的指令 - 汇编 gcc -c 01.s -o 01.o
打开.o文件,嗯,现在你什么都看不懂了,因为现在是一堆二进制,但是现在我们可以执行了 - 执行 gcc 01.o -o 01_elf
生成可执行文件 执行 01_elf
一步编译
gcc 01.c -o demo(还是经过:预处理、编译、汇编、链接的过程) 这样我们会直接得到一个exe直接执行就好,但是注意这种“非法的”exe很容易被杀毒软件干掉(杀毒软件太灵敏也很无奈,白名单都没有,有的时候只能关掉了)
查找程序所依赖的动态库
说实话,我觉得这个功能真的不要太有用,之后你会遇到很多库,当他因为库连接不上报错的时候,这个真的真的好用 Windows平台下,我们需要安装相应软件(Depends.exe),来实现这一功能。depends是一款可以查看一个exe文件或dll文件需要依赖哪些dll文件的工具,比如我们生产了一个exe程序,显然在我们的开发环境下是可以执行这个exe程序的,但是换一个环境就不见得了,有的时候我们需要安装库来支持代码的实现,但是突然报错不识别函数,基本就是某一个库没有链接上了,所以我们需要知道这个exe程序都依赖哪些动态链接库,以保证程序离开了开发环境还可以正常运行。 这个下载很方便,不用安装直接解压就能用,[官网在这里],(http://www.dependencywalker.com/) 解压之后直接点击exe就行,在应用里面选择相应的exe文件,但是不知道为什么,我每次打开都很卡,唉。后来看到这篇文件,简直提速不知一百倍,推荐给大家 包括一些报错x64,x86不兼容的问题,dll版本不对的问题都可以用这里软件来查找解决
暂定下一篇讲内存,关于作用域和内存分区,flag立着里,看我什么时候来兑现吧
|