makefile(一)

摘要:
Makefile的特定实例源:http://blog.sina.com.cn/s/blog_73d4d5fa0100paiy.html(2011-03-0623:10:02)再现▼ 标签:linux。makefile杂项分类:Linux系统管理项目中的代码分别存储在add/add _ int.c、add/add_ float.c、add/add中。h、 sub/intc、sub/fl

Makefile的一个具体的实例

来源:http://blog.sina.com.cn/s/blog_73d4d5fa0100paiy.html

 makefile(一)第1张(2011-03-06 23:10:02)
标签: 

linux.makefile

 

杂谈

分类: Linux系统管理

工程中的代码分别存放在add/add_int.c、add/add_float.c、add/add.h、sub/sub_int.c、sub/sub_float.c、sub/sub.h、main.c中。

Makefile的一个具体的实例

文件main.c

#include <stdio.h>

#include "add.h"            

#include "sub.h"

int main(void)

{

       int input = 0;

       int a = 10, b = 12;

       float x= 1.23456,y = 9.87654321;

      

       printf("int a+b IS:%d ",a+b);

       printf("int a-b IS:%d ",a-b);

       printf("float x+y IS:%f ",x+y);

       printf("float x-y IS:%f ",x-y);

       return 0;      

}

add.h

#ifdef __ADD_H__

#define __ADD_H__

extern int add_int(int a, int b);

extern float add_float(float a, float b);

#endif  

add_flaot.h

float add_float(float a, float b)

{

       return a+b;  

}  

 

add_int.c

int add_int(int a, int b)

{

       return a+b;  

}

add.h

#ifdef __ADD_H__

#define __ADD_H__

extern float sub_float(float a, float b);

extern int sub_int(int a, int b);

#endif 

sub_float.c

float sub_float(float a, float b)

{

       return a-b;   

sub_int.c

int sub_int(int a, int b)

{

       return a-b;   

}

命令行编译程序:

#gcc -c add/add_int.c -o add/add_int.o      #生成add_int.o目标函数

#gcc -c add/add_float.c -o add/add_float.o   #生成add_float.o目标函数

#gcc -c sub/sub_int.c -o sub/sub_int.o       #生成sub_int.o目标函数

#gcc -c sub/sub_float.c -o sub/sub_float.o    #生成sub_float.o目标函数

#gcc -c main.c -o main.o  -I ./add -I ./sub                #生成main.o目标函数

#gcc -o casu add/add_int.o add/add_float.o sub/sub_int.o sub/sub_float.o main.o

#链接生成cacu

多文件的makefile

#生成casu,“;”右边为目标

casu:add_int.o add_float.o sub_int.o sub_float.o main.o

       gcc -o casu add/add_int.o add/add_float.o           # 为连接符

                     sub/sub_int.o sub/sub_float.o main.o    

#生成add_int.o的规则,将add_int.c编译生成目标文件add_int.o

add_int.o:add/add_int.c add/add.h

       gcc -c -o add/add_int.o add/add_int.c

#生成add_float.o的规则

add_float.o:add/add_float.c add/add.h

       gcc -c -o add/add_float.o add/add_float.c

#生成sub_int.o的规则

sub_int.o:sub/sub_int.c sub/sub.h

       gcc -c -o sub/sub_int.o sub/sub_int.c

#生成sub_float.o的规则

sub_float.o:sub/sub_float.c sub/sub.h

       gcc -c -o sub/sub_float.o sub/sub_float.c

#生成main.o的规则

main.o:main.c add/add.h sub/sub.h

       gcc -c -o main.o main.c -Iadd -Isub

      

#清理规则

clean:

       rm -f casu add/add_int.o add/add_float.o

             sub/sub_int.o sub/sub_float.o main.o

使用自定义变量的makefile文件:

CC = gcc                                #CC定义成gcc

CFLAGES =    -Iadd -Isub -O2   #加入头文件搜索路径sub和add,O2为优化#目标文件

OBJS = add/add_int.o add/add_float.o

              sub/sub_int.o sub/sub_float.o main.o

TARGET = casu                           #生成的可执行文件

RM = rm -f                              #删除的命令

$(TARGET):$(OBJS)                       #TARGET目标,需要先生成OBJS目标

       $(CC) -o $(TARGET) $(OBJS) $(CFLAGES)   #生成可执行文件

$(OBJS):%.o:%.c          #将OBJS中所有扩展名为.o的文件替换成扩展名为.c的文件

       $(CC) -c $(CFLAGES) $< -o $@        #采用CFLAGS指定的选项编译生成目标文件

clean:                               #清理

       -$(RM) $(TARGET) $(OBJS)           #删除所有的目标文件和可执行文件

使用预定义变量的makefile文件:

CFLAGES =    -Iadd -Isub -O2               #编译选项

OBJS = add/add_int.o add/add_float.o

               sub/sub_int.o sub/sub_float.o main.o

TARGET = casu                          #生成的可执行文件

$(TARGET):$(OBJS)                       #TARGET目标,需要先生成OBJS目标

       $(CC) -o $(TARGET) $(OBJS) $(CFLAGES)  #生成可执行文件

$(OBJS):%.o:%.c          #将OBJS中所有扩展名为.o的文件替换成扩展名为.c的文件

       $(CC) -c $(CFLAGES) $< -o $@        #采用CFLAGS指定的选项编译生成目标文件

clean:                               #清理

       -$(RM) $(TARGET) $(OBJS)           #删除所有的目标文件和可执行文件

使用自动变量的makefile文件:

CFLAGES =    -Iadd -Isub -O2               #编译选项

OBJS = add/add_int.o add/add_float.o

               sub/sub_int.o sub/sub_float.o main.o

TARGET = casu                           #生成的可执行文件

$(TARGET):$(OBJS)                       #TARGET目标,需要先生成OBJS目标

       $(CC) -o  $@  $^ $(CFLAGES)          #生成可执行文件

$(OBJS):%.o:%.c          #将OBJS中所有扩展名为.o的文件替换成扩展名为.c的文件

       $(CC) -c $<  $(CFLAGES) -o $@      #采用CFLAGS指定的选项编译生成目标文件

clean:                               #清理

       -$(RM) $(TARGET) $(OBJS)           #删除所有的目标文件和可执行文件

使用搜索路径的makefile文件:

CFLAGES =    -Iadd -Isub -O2  

OBJSDIR = .objs

VPATH = add:sub:.        

OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o

TARGET = casu                          

$(TARGET):$(OBJSDIR) $(OBJS)      #先检测OBJSDIR和OBJS依赖项是否存在                 

       $(CC) -o $(TARGET) $(OBJSDIR)/*.o $(CFLAGES)

 #将OBJSDIR目录中所有的.o文件链接成casu          

$(OBJS):%.o:%.c         

       $(CC) -c  $< $(CFLAGES) -o $(OBJSDIR)/$@ #生成目标文件,存放在OBJSDIR目录中

$(OBJSDIR):

       mkdir -p ./$@            #建立目录,-p选项可以忽略父目录不存在的错误

clean:                                

       -$(RM) $(TARGET)        #删除casu

       -$(RM) $(OBJSDIR)/*.o    #删除OBJSDIR目录下的所有.o文件

使用自动推导规则的makefile

CFLAGS = -Iadd -Isub -O2         # 用户自定义变量

VPATH=add:sub                # 搜索路径

OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o

TARGET = cacu

$(TARGET):$(OBJS)             #OBJS依赖项的规则自动生成

       $(CC) -o $(TARGET) $(OBJS) $(CFLAGS)    #链接文件

clean:

       -$(RM) $(TARGET)        #“-”表示当前操作失败时不报错,命令继续执行

       -$(RM) $(OBJS)

使用函数的makefile文件:

CC = gcc                               #CC定义成gcc

VPATH =add:sub

CFLAGES =    -Iadd -Isub -O2     #加入头文件搜索路径sub和add,O2为优化#目标文件

TARGET = casu                         #生成的可执行文件

DIRS = sub add .                     #DIRS字符串的值为目录add、sub和当前目录

FILES = $(foreach dir, $(DIRS),$(wildcard $(dir)/*.c))  #查找所用目录下的.c文件

OBJS = $(patsubst %.c,%.o,$(FILES))          #将.c替换成.o

$(TARGET):$(OBJS)                        #TARGET目标,需要先生成OBJS目标

       $(CC) -o $(TARGET) $(OBJS) $(CFLAGES)   #生成可执行文件

clean:                                  #清理

       -$(RM) $(TARGET) $(OBJS)              #删除所有的目标文件和可执行文件

免责声明:文章转载自《makefile(一)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Math工具类的使用Oracle 12c 数据库中scott用户不存在的解决方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Qt的.Pro文件和makefile文件之间相互转换

1、linux系统环境下makefile转pro 在已有项目的目录(makefile目录所在)中 /home/dev/Qtxxx/xxx/gcc_64/bin/qmake -project 会生成一个.pro文件 然后就可以在qt creator中打开了 (PS:创建的工程不是根据makefile创建的,qmake只是遍历目录及其子文件夹的文件,然后添加到...

Gyp语法规则参考 &amp;amp; 工具的使用

by Markdown, 8/14/2014 10:17:28 AM 翻译自 https://code.google.com/p/gyp/wiki/GypLanguageSpecification 目的和背景 Google使用过很多处理平台无关的项目构建系统,比如Scons,CMake。在实际使用中这些并不能满足需求。开发复杂的应用程序时,在Mac上Xco...

Android 最火框架XUtils之注解机制具体解释

在上一篇文章Android 最火的高速开发框架XUtils中简介了xUtils的基本用法,这篇文章说一下xUtils里面的注解原理。 先来看一下xUtils里面demo的代码: @ViewInject(R.id.tabhost) private FragmentTabHost mTabHost; @ViewInject(R.id.big_img...

java分模块项目在idea中使用maven打包失败(ps:maven常用到的命令)

一、分模块项目打包失败    情况:项目是分模块创建的,一些公共的方法是单独的一个模块common,其他模块依赖于此模块,poom依赖已经添加了,项目可以正常运行,但使用maven打包时出现了问题:找不到依赖的jar包;    解决历程   1. 首先对项目common依次进行clean、install。(注意:package和install是有区别的,p...

[Selenium] CSS3 选择器

http://www.cnblogs.com/MasterMonkInTemple/category/564552.html 在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素。 "CSS" 列指示该属性是在哪个 CSS 版本中定义的。(CSS1、CSS2 还是 CSS3。) 选择器 例子 例子描述 CSS .class .intro 选...

xtrabackup增量备份mysql +MHA

http://blog.csdn.net/yanggd1987/article/category/2214421 https://www.centos.bz/2013/09/innobackupex-auto-backup-with-shell/   之前我们提到过xtrbackup备份mysql的几种方式:完整备份、增量备份、部分备份等,但是在实际生...