从源代码到可执行文件
源代码.c/cpp------>可执行文件.out/exe
预处理生成.i
汇编文件.s
生成二进制.o
链接成可执行文件.out/exe // 多个.o目标文件链接后生成可执行文件
g++ –E main.cpp // 生成.i
g++ –S main.i main.s // 由.i生成.s
g++ -C main.cpp // 生成.o二进制目标文件 .cpp--->.o
g++ main.o -o AA // 由.o目标文件到可执行文件AA.out/exe .o--->.out/exe
g++ main.cpp // 编译连接一起,生成可执行文件a.out/exe .cpp-->.out/exe
g++ main.cpp -o AA // 由.cpp源文件到可执行文件AA.out/exe
.a/lib(静态库)
.a/lib文件是将.o文件打包生成的静态库。
.a(libxxx.a)静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。
文件实质上就是.o文件打了个包,一般把它叫做静态库文件,它在使用的时候,效果和使用.o文件是一样的。
.so/dll(动态库)
.so/dll文件是动态库,当程序运行的时候才加载进来。
.so(libxxx.so)动态库文件名的命名规范是以lib为前缀,紧接着跟动态库名,扩展名为.so。
编译选项-I
是查找头文件、-D
宏定义
编译选项 -E -S -C
输出文件 -i -s -o
(预处理文件、汇编文件、目标文件)
生成预处理文件
gcc -E ./main.c -I ./include -o man.i //生成预处理文件,-I指定头文件路径
.a 和 .so的特点
找到自己的动态库 Linux中
xxx.so.1 1通常表示版本,需要不同版本时可以把.so软链接到对应版本的.so即可。
编译成.o时 注意需要编译成位置无关码,
三种方式,
- 直接将.so拷贝到系统lib里 (不建议)
- 在环境变量中添加
- 将路径添加到系统动态库的配置文件
对于.so的链接方法 启动时链接 和 显式运行时链接(运行时加载)
运行时加载的优点:运行时加载使得程序的模块组织更加灵活,可以实现诸如插件、驱动等功能,实现了使用时才加载、使用完即卸载。
- 不必从程序一开始就将其全部装载进来,减少了程序启动时间和内存使用
- 程序不必重启就可以实现模块的增加、删除、更新等
对于服务器端的应用程序来说,显式运行时链接可以在程序不重启的情况下加载更新后的动态库,这对于7*24小时工作的服务器来说是至关重要的。