makefile 可以用于编译和执行多个C/C++源文件和头文件。

(1) #include "file.h" 和 #include <file.h> 的区别

#include "file.h" 会先在当前目录下查找file.h,然后才在系统头文件目录中进行查找;

#include <file.h>会先查找系统头文件目录,默认是不会在当前目录下查找的。

(2) 关于在头文件中使用#ifndef 和 #define

头文件的主要作用在于多个代码文件全局变量(函数)的重用、防止定义的冲突,对各个被调用函数给出一个描述,其本身不需要包含程序的逻辑实现代码,它只起描述性作用,用户程序只需要按照头文件中的接口声明来调用相关函数或变量,链接器会从库中寻找相应的实际定义代码。

#ifndef是属于宏定义的一种,但确切地说它应该是预处理功能(宏定义,文件包含和条件编译)中的第三种--条件编译。而#define则就是属于宏定义。

定义:

#ifndef x   //先测试x是否被宏定义过
#define x
程序段1     //如果x没有被宏定义过,定义x,并编译程序段 1
#else
程序段2     //如果x已经定义过了则编译程序段2的语句,“忽视”程序段 1。
#endif     //终止if

作用: #ifndef 起到的效果是防止一个源文件两次包含同一个头文件,而不是防止两个源文件包含同一个头文件。网上很多资料对这一细节的描述都是错误的。事实上,防止同一头文件被两个不同的源文件包含这种要求本身就是不合理的,头文件存在的价值就是被不同的源文件包含。假如你有一个C源文件,它包含了多个头文件,比如头文件A和头文件B,而头文件B又包含了头文件A,则最终的效果是,该源文件包含了两次头文件A。如果你在头文件A里定义了结构体或者类类型(这是最常见的情况),那么问题来了,编译时会报大量的重复定义错误。

(3) CFLAGS, CXXFLAGS, LDFLAGS, LIBS

CFLAGS 表示用于 C 编译器的选项,
CXXFLAGS 表示用于 C++ 编译器的选项。
这两个变量实际上涵盖了编译和汇编两个步骤。

CFLAGS: 指定头文件(.h文件)的路径,如:CFLAGS=-I/usr/include -I/path/include。同样地,安装一个包时会在安装路径下建立一个include目录,当安装过程中出现问题时,试着把以前安装的包的include目录加入到该变量中来。

LDFLAGS:gcc 等编译器会用到的一些优化参数,也可以在里面指定库文件的位置。用法:LDFLAGS=-L/usr/lib -L/path/to/your/lib。每安装一个包都几乎一定的会在安装目录里建立一个lib目录。如果明明安装了某个包,而安装另一个包时,它愣是说找不到,可以抒那个包的lib路径加入的LDFALGS中试一下。

LIBS:告诉链接器要链接哪些库文件,如LIBS = -lpthread -liconv

简单地说,LDFLAGS是告诉链接器从哪里寻找库文件,而LIBS是告诉链接器要链接哪些库文件。不过使用时链接阶段这两个参数都会加上,所以你即使将这两个的值互换,也没有问题。
有时候LDFLAGS指定-L虽然能让链接器找到库进行链接,但是运行时链接器却找不到这个库,如果要让软件运行时库文件的路径也得到扩展,那么我们需要增加这两个库给"-Wl,R":
LDFLAGS = -L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib
如果在执行./configure以前设置环境变量export LDFLAGS="-L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib" ,注意设置环境变量等号两边不可以有空格,而且要加上引号(shell的用法)。那么执行configure以后,Makefile将会设置这个选项,链接时会有这个参数,编译出来的可执行程序的库文件搜索路径就得到扩展了。

转载于:https://www.cnblogs.com/alliance/p/6944519.html

Linux下Makefile学习笔记相关推荐

  1. linux下Makefile学习--注释很好

    什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都 为你做了这个工作,但我觉得要作一个好的和 professional的程序员,makefile还 ...

  2. Linux下汇编语言学习笔记12 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  3. Linux下汇编语言学习笔记65 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  4. Linux下汇编语言学习笔记13 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  5. Linux下汇编语言学习笔记47 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  6. Linux下汇编语言学习笔记51 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  7. Linux下汇编语言学习笔记76 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  8. linux定义数据结构压缩,Linux下数据结构学习笔记

    一.顺序表 使用数组实现 优点:查找快,可以使用下标定位 缺点:增加.删除慢,之后的所有元素需要移动 结构体定义方式1: 需要malloc创建数组 typedef struct seqlist{ // ...

  9. Linux下Makefile编写语法

    原创 Linux下Makefile编写语法 2016-07-29 08:31:53 Datrilla 阅读数 1386更多 分类专栏: Linux Makefile 版权声明:本文为博主原创文章,遵循 ...

最新文章

  1. 如何读懂MEMS惯性器件的精度指标
  2. Node.js 目录操作
  3. P1351 联合权值
  4. 1.3 编程基础之算术表达式与顺序执行 10 计算并联电阻的阻值
  5. XP-SP3 安装之后怎么禁止更新
  6. 360补丁打上以后漏洞依然存在?
  7. Arcgis javascript那些事儿(十三)——距离面积计算
  8. 如何在Mac上的键盘辅助功能中使用面板编辑器?
  9. Java scv文件处理类
  10. HaaS EDU K1设备资源总体介绍
  11. js获取今天剩余时间_骚姿势获取无线路由器后台权限
  12. iOS ● 非常全的三方库、插件、大牛博客等等
  13. pdf照片显示正常打印时被翻转_2020年上海二级建造师准考证打印常见问题
  14. 计算机网络之Dos、DDos攻击
  15. JS 沙箱隔离简单实现
  16. Java经典好资源-[http://blog.csdn.net/miaogang]
  17. 【PADS9.5】PADS Logic 绘制原理图
  18. matlab ezplot hod,Matlab学习笔记三:绘图
  19. OpenCV实现远程视频监控与运动目标检测
  20. 国产数据库应用调查统计

热门文章

  1. 利用cache特性检测Android模拟器
  2. 预言机、预言机网络、预测市场
  3. 浏览器控制台执行代码_JavaScript 和 浏览器那些事
  4. case when else 默认随机_SQL高级知识——CASE的用法
  5. 计算机应用与网络讲义,计算机基础讲义
  6. sqlserver 储存过程 批量更新_大白菜怎么储存过冬,好吃还不烂?掌握方法,其实很简单...
  7. c#读蓝牙数据_客户端实现蓝牙接收(C#)知识总结
  8. 文本分类入门(二)文本分类的方法
  9. BZOJ-1005-明明的烦恼
  10. 城市问题(Floyd)