2016年7月25日星期一

程序编译过程认识

  使用debian,为获取新的软件特性,常常需要自行编译源码。编译源码需要依次键入命令,
常常在enter一条命令后,经常会被卡住,为了新软件特性,我被迫去了解程序编译的流程。
 
1  程序编译的流程:
     1.1  编译器读取main源文件的 #include部分,将 #include包含的.h头文件的内容读入添加到,
            main源文件中。再作宏名替换成数值。
     1.2  编译器将预编译处理准备好的main源文件,先编译成汇编代码,然后再通过汇编器,
            编译成二进制代码。
     1.3  编译器调用链接器linker。 linker将同个文件夹内编译成二进制代码的cpp文件,连接起来
            组合成可执行程序文件,这个link称为静态链接。动态链接是在main.o中添加含有其他函
            数的动态.so模块的位置信息,组成main可执行程序文件。当main运行时,linker会去指定
            位置找函数实现代码。

2  对头文件的理解:
     2.1  头文件的作用:许多函数原型添加概括为一条#include, 减少了无意义的重复。
                                        独立的模块,更改函数原型方便。
                                        抽出main中的函数原型声明和宏定义,方便main主文件阅读。
     2.2  写头文件        : 头文件分为header guard 和 declaration 两部分。
                                         
                                          #ifndef _ADD_H
                                          #define _ADD_H
                                         
                                          int add(int,int);
                   
                                          #endif
     2.3  用头文件       : <> 和“ “ 表示告诉编译器头文件的位置。
                                        <> 表示头文件在根目录,” ”表示头文件在当前目录/自定义目录
                                        <> ""还可以用来区分标准库和其他库,按照惯例命名。标准库用<>
                                        自定函数也是可以用<>,写完将自定函数头文件放进标准库的文件里
 3  对linker的理解:
      3.1  linker默认只会去/usr/lib/x86_64-linux-gnu/,去找动态库模块。自定义函数实现咬动态链
             接的,可以用g++ add.cpp -fPIC -shared -o libadd.so,将cpp做成so模块,再放进x86_64-
             linux-gnu文件夹里面。 静态链接的,将多个cpp文件放在同一文件夹,同时编译链接就
             好了。g++ add.cpp main.cpp - o main.
4   不理解:
            用g++.静态链接编译后的程序比动态链接的体积咬小。用codeblock编译的比g++的体积大好多。  codeblock添加#include<iostream> ,编译链接后,体积大9KB左右。


没有评论:

发表评论