gcc 编译基础
gcc common variable
-l/path 是加入某个library,库的前缀lib和扩展名(.a或.so)不需要写
-I/path 后面接的路径就是设置要去搜索相关的include文件的目录.
-Wall 编译的时候输出警告信息
-O 在编译的时候,依据操作系统环境,对程序进行优化
gcc default
- linux 默认是将函数库放置在/lib与/usr/lib当中.gcc默认会链接这两个路径下的函数库.
-
同理,gcc编译会默认会搜索/usr/include目录下的头文件.
-
通常称-Wall或者-O这些非必要的参数为标志FLAGS,当使用c语言的时候,也可能简称这些标志为CFLAGS
make好处
-
简化编译时候所需要执行的命令.make会主动去判断每个目标文件相关的源码文件,并且直接编译成.o文件
-
若在编译完成之后,修改某个源码文件,则make仅会针对修改过的文件进行编译
-
可以依照相关性来更新执行文件.
makefile基本语法
-
basic
target : 目标文件1 目标文件2 <tab> gcc -o 欲编译的可执行文件 目标文件1 目标文件2
- definition variable in Makefile
LIBS = -lm OBJS = 目标文件1 目标文件2 main : $(OBJS) gcc -o main $(OBJS) $(LIBS) clean : rm -f main $(OBJS)
make waith external variable
- 由于gcc在进行编译的行为时,会主动去读取CFLAGS这个环境变量.也可以将这个变量定义到Makefile变量中.
CFLAGS="-Wall" make clean main
- Makefile中的$@代表目前的target.
-
变量优先级
- make 命令行后面的环境变量为第一优先
- Makefile里面的环境变量为第二优先
- shell原本具有的环境变量为第三优先
configure
编译程序前,一般先执行./configure来创建Makefile
库函数
库函数分为动态与静态库函数
static library | dynamic library | |
---|---|---|
扩展名 | .a | .so |
编译行为 | 会直接整合到程序中 | 不会 |
独立运行 | 编译的可执行文件能独立运行 | 不能 |
升级 | 整个程序需要重新编译 | 方便 |
ldconfig and /etc/ld.so.conf
作用将常用到的动态函数库先加载内存当中.
- 需要加载进内存的函数库,配置到/etc/ld.so.conf.d/xxx.conf
- ldconfig 加载配置
- ldconfig -p 打印已经加载到内存中的函数库.
程序的动态函数解析: ldd
查询某个可执行的二进制文件含有什么动态函数库.
Tarball
- 建议将自己安装的软件安装在/usr/local下
- 源码则建议放置在/usr/local/src
REFRENCE
鸟哥的linux私房菜