补充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
本文详细介绍了程序的执行步骤,包括预编译、编译、汇编和链接。讲解了静态库和动态库的区别,制作过程以及命名规则。在Linux环境下,演示了如何使用g++编译器创建静态库和动态库,并展示了如何在程序中链接这些库。同时,讨论了静态库与动态库的优缺点,以及动态库的加载方式和依赖关系查询。最后,阐述了程序内存的划分,包括代码段、数据段、堆和栈的分配情况。
2万+

被折叠的 条评论
为什么被折叠?



