GCC和G++的区别

GCC和G++的不同

后缀为.c的,GCC把它当作C程序;G++把它当作c++程序
后缀为.cpp的,两者都会把他认为是c++程序

编译阶段G++会调用GCC,对于 C++ 代码,两者是等价的,但是因为 gcc
命令不能自动和 C++ 程序使用的库联接,所以通常用G++来完成链接,但是也可以使用 gcc -lstdc++。

GCC常用的选项

GCC编译选项 说明
-E 对指定的文件进行预处理
-S 对指定的文件进行编译
-c 编译汇编指定的文件,但是不进行链接
gcc file1 file2 -o a.out 编译为可执行文件
-I dir 指定include包含文件的搜索目录
-g 在编译的时候生成调试信息
-D 指定一个宏
-w 不生成任何警告信息
-Wall 生成所有警告信息
-On n的取值范围:0~3。编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-l 在程序编译的时候,指定使用的库
-L 指定编译的时候,搜索的库的路径。
-fPIC/fpic 生成与位置无关的代码
-shared 生成共享目标文件,通常用在建立共享库时
-std 指定C方言,如:-std=c99,gcc默认的方言是GNU C

静态库和动态库

库文件有两种,静态库和动态库(共享库),区别是:静态库在程序的链接阶段被复制
到了程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。

库的好处:1.代码保密 2.方便部署和分发

静态库

Linux : libxxx.a
lib : 前缀(固定)
xxx : 库的名字,自己起
.a: 后缀(固定)

静态库的制作

gcc获得.o文件
使用ar工具:ar rcs libxxx.a xxx.o xxx.o
r:将文件插入到备份文件中
c:建立备存文件
s:索引

动态库

Linux : libxxx.so
lib : 前缀(固定)
xxx : 库的名字,自己起
.so
: 后缀(固定)
在Linux下是一个可执行文件

动态库的制作

gcc得到.o文件,得到和位置无关的代码
gcc -c –fpic/-fPIC a.c b.c

gcc 得到动态库
gcc -shared a.o b.o -o libcalc.so

静态库:gcc进行链接的时候,会把静态库的代码大报道可执行文件中
动态库:CC 进行链接时,动态库的代码不会被打包到可执行程序中,程序启动之后,动态库会被动态加载到内存中,通过 ldd (list dynamic dependencies)命令检查动态库依赖关系

定位共享库文件的方式

对于elf格式的可执行程序,是由ld-linux.so来完成的,它先后搜索elf文件的 DT_RPATH段 ——> 环境变量LD_LIBRARY_PATH ——> /etc/ld.so.cache文件列表 ——> /lib/,/usr/lib
目录找到库文件后将其载入内存。

如果自己要修改的话,可以从环境变量,和/etc/ld.so.conf中,在root权限下进入etc/profile

后面加上要增加的路径,然后source 配置文件,就可以

静态库和动态库的对比

静态库
被打包到应用程序中加载速度快
发布程序无需提供静态库,移植方便
消耗系统资源,浪费内存
更新、部署、发布麻烦

动态库
可以实现进程间资源共享(共享库)
加载速度比静态库慢
更新、部署、发布简单
发布程序时需要提供依赖的动态库
可以控制何时加载动态库

posted @ 2021-06-01 20:35  陌天森  阅读(422)  评论(0编辑  收藏  举报