使用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左右。