补充2-程序相关知识
1. 程序执行步骤
-
预编译:展开头文件、注释、宏替换
g++ test.cpp -E -o test.i
-
编译:生成汇编代码
g++ test.i -S -o test.s
-
汇编:生成机器码
g++ -c test.cpp
-
链接:不同目标文件进行连接,生成可执行文件
g++ test.s -s -o test.o
2. 动态链接、静态链接
2.1 静态链接
-
静态库:在链接阶段复制到了程序中
-
命名规则
- linux: libxxx.a
- windows: libxxx.lib
-
制作过程
-
使用src中的源文件,制作静态库
g++ -c add.cpp minis.cpp -I ../include/ ar rcs libcalc.a minis.o add.o
-
将创建的静态库移动到lib中
mv libcalc.a ../lib/
-
使用静态库编译main.cpp
g++ main.cpp -o mian -I include/ -L lib/ -l calc
g++中,-I 指定头文件位置,-L 指定库文件位置,-l 指定库文件
2.2 动态链接
-
动态库:运行时由系统加载到内容中供程序调用
- 命名规则
- linux: libxxx.so
- windows: libxxx.dll
- 制作过程
- 命名规则
- 使用src中的源文件,制作动态库
g++ -c -fpic add.cpp minis.cpp -I ../include/
g++ -shared *.o -o libcalc.so
- 将创建的动态库移动到lib中
mv libcalc.a ../lib/
-
使用动态库编译main.cpp
g++ main.cpp -o mian -I include/ -L lib/ -l calc
-
添加动态库路径
-
临时配置
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/workspace/WebServr/lession04/lib
-
永久配置 用户级
在.bashrc中加入上述指令 source .bashrc
-
永久配置 系统级
在/etc/profile中加入上述指令 source /etc/profile
-
永久配置 系统级
在/etc/ld.so.conf中加入路径 ldconfig
-
dll 查询依赖关系
2.3 动态库、静态库对比
-
静态库
-
优点
- 加载速度快
- 发布程序无需提供静态库、移植方便
-
缺点
- 消耗系统资源、浪费内存
- 更新、部署、发布麻烦
- 消耗系统资源、浪费内存
-
-
动态库
-
优点
- 可以实现进程间资源共享
- 更新、部署、发布简单
- 可以控制何时加载动态库
-
缺点
- 加载速度慢
- 发布时需要提供依赖的动态库
- 加载速度慢
-
3. 程序内存划分
-
用户区 0-3G
-
.text 代码段
-
.data 已初始化的全局变量
-
.bss 未初始化的全局变量
-
堆空间 低地址 -> 高地址
-
共享库
-
栈空间 高地址 -> 低地址
-
-
内核区 3-4G