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 配置文件,就可以
静态库和动态库的对比
静态库
被打包到应用程序中加载速度快
发布程序无需提供静态库,移植方便
消耗系统资源,浪费内存
更新、部署、发布麻烦
动态库
可以实现进程间资源共享(共享库)
加载速度比静态库慢
更新、部署、发布简单
发布程序时需要提供依赖的动态库
可以控制何时加载动态库