4

周生政

make约定俗成的规范:

  • 1,首先从源代码生成目标文件(预处理,编译,汇编),"-c"选项表示不执行链接步骤。

$(CC) $(CPPFLAGS) $(CFLAGS) example.c -c -o example.o

  • 2,然后将目标文件连接为最终的结果(连接),"-o"选项用于指定输出文件的名字。

$(CC) $(LDFLAGS) example.o -o example

  • 有一些软件包一次完成四个步骤:

$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) example.c -o example

CFLAGS 与 CXXFLAGS

CFLAGS 表示用于 C 编译器的选项,CXXFLAGS 表示用于 C++ 编译器的选项。这两个变量实际上涵盖了编译和汇编两个步骤。大多数程序和库在编译时默认的优化级别是”2″(使用”-O2″选项)并且带有调试符号来编 译,也就是 CFLAGS=”-O2 -g”, CXXFLAGS=$CFLAGS 。事实上,”-O2″已经启用绝大多数安全的优化选项了。另一方面,由于大部分选项可以同时用于这两个变量,所以仅在最后讲述只能用于其中一个变量的选 项。[提醒]下面所列选项皆为非默认选项,你只要按需添加即可。

LDFLAGS

ld用于指定链接时参数

gcc参数解释

编译

  • c 编译
  • Wall 最常用到的编译警告, 推荐总是使用该选项
  • o 小写字母o指定结果文件名称
  • l 链接库。编译器选项“-lNAME”试图链接标准库目录下的文件名为“libNAME.a”。lm => libm.a;
  • I 指定头文件搜索路径
  • L 库搜索路径
  • static 使用静态库
  • ansi禁止那些与 ANSI/ISO 标准冲突的 GNU 扩展特性。在使用 GNU C 库(glibc) 的系统上,该选项也禁止了对 C 标准库的扩展。
  • std 指定标准, c89,c99,gnu99,gnu89
  • W常见潜在编程错误,建议开发时使用

预处理

  • D -DNAME选项在命令行上定义预处理宏 NAME
  • E 预处理源文件

调试

  • g 存储额外的调试信息

优化

  • O0 或者无-O选项: 无优化
  • O1或者O: 不需要任何速度-空间折衷的最常见形式的优化
  • O2、03:更近异步优化

平台相关

  • march=CPU, 速度快,不可移植。–march=pentium4

动态链接

一个与共享库链接的可执行文件仅仅包含它用到的函数相关的一个表格,而不是外部函数所在的 对象文件的整个机器码。在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的 该共享库中复制到内存中----这个过程被称作动态链接

变量

  • LD_LIBRARY_PATH 动态库查找路径
  • C_INCLUDE_PATH 头文件查找路径
  • LIBRARY_PATH 静态查找路径

AI及LNMPRG研究
7.2k 声望12.8k 粉丝

一群热爱代码的人 研究Nginx PHP Redis Memcache Beanstalk 等源码 以及一群热爱前端的人