Linux下Makefile学习笔记

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将会设置这个选项,链接时会有这个参数,编译出来的可执行程序的库文件搜索路径就得到扩展了。

时间: 2024-10-12 22:08:44

Linux下Makefile学习笔记的相关文章

Linux下git学习笔记(一)

我是跟着廖雪峰大神的博客学习git的,他讲的非常容易懂 (http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000),然后自己跟着学的时候并不是很顺利,向github提交代码的时候老是报错,不过最后google很久之后给解决了. 先回顾下今天学的吧 一:在Linux上安装Git sudo apt-get install git 因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:

Linux下Python学习笔记 1:数据类型

一.开发环境 开发Python的环境选择很多,windows.Linux.MacOs都可以,除了Windows需要在Python官网上下载安装包,并配置环境变量.在Linux和MacOs上都是自带Python的,关于Python的版本大多都是2.7.* 本文选择了Ubuntu环境来学习Python,主要原因是为了顺便熟悉Linux的环境与命令,开发工具选择的是Vim,当然更多其他的选择有Eclipse.Sublime.pycharm等等,根据个人喜好选择即可, 另:文章部分内容来自Imooc和5

linux下Makefile学习

1. 基本概念 关于程序的编译和链接: 编译 链接源码------中间代码------可执行文件.c .o编译过程中,主要检查语法是否正确,函数与变量声明是否正确,若函数未被声明,编译器会给出警告,但可以生成obj文件:链接时,主要链接函数和全局变量,负责管理中间目标文件,寻找函数的实现,若找不着,报链接错误码. 大多数情况下,由于源文件较多,编译生成的中间目标文件太多,在链接时要指出的中间目标文件太多,这对编译很不方便,所以可给中间目标文件打个包,window下称为库文件,即.lib文件:UN

Linux下Python学习笔记 2:条件判断、循环

一.条件判断 if 语句 比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,可以用if语句实现: 注意: Python代码的缩进规则.具有相同缩进的代码被视为代码块,上面的3行 print 语句就构成一个代码块(但不包括第4行的print).如果 if 语句判断为 True,就会执行这个代码块. 缩进请严格按照Python的习惯写法:4个空格,不要使用Tab,更不要混合Tab和空格,否则很容易造成因为缩进引起的语法错误. 在ubuntu下的vim中需要设置tab默认为4个空格,可

Linux下Python学习笔记 3:函数

一.什么是函数 函数简单来理解就是数字按一定规律重复出现的规则,我们知道圆的面积计算公式为:S = πr²,当我们知道半径r的值时,就可以根据公式计算出面积.在编程中函数被进一步封装成了方法,接收外部传入的参数来带入规则,继而返回相应的结果.那方法的封装其实是一种抽象的结果. 抽象是数学中非常常见的概念.举个例子: 计算数列的和,比如:1 + 2 + 3 + ... + 100,写起来十分不方便,于是数学家发明了求和符号∑,可以把1 + 2 + 3 + ... + 100记作: 100 ∑n n

linux系统构建学习笔记

嵌入式系统构架:(硬件+软件)应用软件层: Application GNU C Library(glibc)文件系统: 系统层: API(Systern Call Interface) OS Core + Power Mannager+ File Manager + GUI Mannager TCP/IP HTTP WAP DataBase Browser DDI(Device Drver Interface) 板级支持:BSP:Board Support Package       OEM A

[转]Windows平台下Makefile学习笔记

Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发现一些开源代码已经在使用VS2010开发,但我还没安装VS2010,我想在VS2008下编译这些代码):另一方面源码在服务器端编译的话,使用IDE的方式编译还是不太方便. 本文主要分为三部分:第一部分讲述namke工具使用makefile的用法:第二部分讲述makefile的主要语法:

Linux内存管理学习笔记——内存寻址

最近开始想稍微深入一点地学习Linux内核,主要参考内容是<深入理解Linux内核>和<深入理解Linux内核架构>以及源码,经验有限,只能分析出有限的内容,看完这遍以后再更深入学习吧. 1,内存地址 逻辑地址:包含在机器语言中用来指定一个操作数或一条指令的地址. 线性地址:一个32位无符号数,用于直接映射物理地址 物理地址:片上引脚寻址级别的地址 2,逻辑地址->线性地址 2.1 段选择符与段寄存器 逻辑地址:段选择符(16位)+段内偏移(32位) index:在GDT或L

Linux System Programming 学习笔记(五) 进程管理

1. 进程是unix系统中两个最重要的基础抽象之一(另一个是文件) A process is a running program A thread is the unit of activity inside of a process the virtualization of memory is associated with the process, the threads all share the same memory address space 2. pid The idle pro