gcc 编译基础与make

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好处

  1. 简化编译时候所需要执行的命令.make会主动去判断每个目标文件相关的源码文件,并且直接编译成.o文件

  2. 若在编译完成之后,修改某个源码文件,则make仅会针对修改过的文件进行编译

  3. 可以依照相关性来更新执行文件.

makefile基本语法

  1. basic

    target : 目标文件1 目标文件2
    <tab> gcc -o 欲编译的可执行文件 目标文件1 目标文件2
    
  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

  1. 由于gcc在进行编译的行为时,会主动去读取CFLAGS这个环境变量.也可以将这个变量定义到Makefile变量中.
    CFLAGS="-Wall" make clean main
    
  2. Makefile中的$@代表目前的target.
  3. 变量优先级

    • make 命令行后面的环境变量为第一优先
    • Makefile里面的环境变量为第二优先
    • shell原本具有的环境变量为第三优先

configure

编译程序前,一般先执行./configure来创建Makefile

库函数

库函数分为动态与静态库函数

static library dynamic library
扩展名 .a .so
编译行为 会直接整合到程序中 不会
独立运行 编译的可执行文件能独立运行 不能
升级 整个程序需要重新编译 方便

ldconfig and /etc/ld.so.conf

作用将常用到的动态函数库先加载内存当中.

  1. 需要加载进内存的函数库,配置到/etc/ld.so.conf.d/xxx.conf
  2. ldconfig 加载配置
  3. ldconfig -p 打印已经加载到内存中的函数库.

程序的动态函数解析: ldd

查询某个可执行的二进制文件含有什么动态函数库.

Tarball

  1. 建议将自己安装的软件安装在/usr/local
  2. 源码则建议放置在/usr/local/src

REFRENCE

鸟哥的linux私房菜

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.