makefile 常用技巧

原创 2016年05月31日 20:27:10

makefile的好处是防止源文件的重复编译

比如有好多个源文件,某天对其中一个源文件进行修改,如果不写makefile的话,需要将整个工程的所有文件重新编译一遍,非常麻烦,有了makefile,说明了每个源文件的依附关系,当某个源文件改变的时候只需重新编译一下关联的源文件就好。

例如:有以下文件

one.h

one.c

two.h

two.c

main.c

main.c 中引入one.h 和two.h两个头文件,one.c two.c 分别实现两个头文件中定义的函数

有两种方式编译运行该程序,

一:手动单独编译

gcc -c one.c

gcc -c two.c

gcc -c main.c

gcc -o main main.o one.o two.o

./main

二:makefile


那么只需在任何一个文本编辑器里面写下如下命令,并保存为makefile

main:main.o one.o two.o

tab键gcc(或者cc)-o main main.o one.o two.o

main.o:main.c one.h two.h

tab键gcc(或者cc)-c main.c


one.o:one.c one.h

tab键gcc(或者cc)-c one.c

two.o:two.c two.h

tab键gcc(或者cc)-c two.c

这些源文件都需要在同一个目录下,并且在main.c中引入one.h 和two.h的时候要用"one.h" "two.h"不要用<>否则编译器会到系统类库文件中去找,是找不到的。

然后在同一目录的终端下,输入make命令,那么编译就开始了,没有什么错误的话,执行./main就可以让你的程序跑起来了。

还可以对makefile进行精简:

首先有三个符号:

1 $@ 代表目标文件

2 $< 代表第一个文件

3$^ 代表所有依赖文件

所以上面命令可以精简为:

main:main.o one.o two.o

tab键gcc(或者cc)-o $@ $^


main.o:main.c one.h two.h

tab键gcc(或者cc)-c $<


one.o:one.c one.h

tab键gcc(或者cc)-c $<


two.o:two.c two.h

tab键gcc(或者cc)-c $<

以上makefile还可以精简:

一个新的符号:.c.o

该符号自动搜索相关联的源文件和头文件

于是makefile还可以写为:


main:main.o one.o two.o

tab键gcc(或者cc)-o $@ $^

.c.o: 
tab键gcc(或者cc) $<

最好在加上clean命令,将生成的目标文件和执行文件删除,遵守优雅简洁原则,呵呵,方便再次编译

clean:

ab键gcc(或者cc)rm main main.o one.o two.o


makefile的格式大家要记住了,至于问什么这样写,只能说这是标准,makefile还有很多高深的用法,以后在逐渐去学习。



例如:

1.编译一个源文件依赖多个库

g++ -m32 -o main main.cpp -I/opt/login_api/include -I/opt/login_api/ -I/opt/Taf/include -L /opt/ptlogin_api_v5.4/lib/ -llogin_api32 -lcomm_albs_v2_client_api32   -L /opt/Taf/lib/ -lutil




2.多个源文件 多个库



CC = gcc
CXX = g++ -m32
# --static 
RANLIB = ranlib
AR = ar
AROPT=-scurv
COMOPT =   -c  




JCE_INC = -I/opt/Taf_3.0.0.29/include
JCE_LIB = -L /opt/Taf_3.0.0.29/lib/ -lutil


PTLOGIN_INC = -I/opt/login_api/include -I/opt/login_api/
PTLOGIN_LIB = -L /opt/ptlogin_api/lib/ -lptlogin_api32 -lcomm_albs_v2_client_api32 








INCLUDE += $(JCE_INC) $(PTLOGIN_INC) 


LIB_LINK += $(JCE_LIB) $(PTLOGIN_LIB) 


#####################################################################################################################




 all: main


 main: main.o unified_checkAuthen.o  CookieKit.o Base64.o  
$(CXX)  -o $@ $^ $(LIB_LINK)
strip $@


 %.o: %.cpp
$(CXX) $(COMOPT)  $(INCLUDE)  $<
ar cru libcheckAuthen.a $@


 clean:
rm -f *.o *.cgi main


Makefile常用的变量

1、自动变量 变量 说明 $@ ...
  • tangchenchan
  • tangchenchan
  • 2015年04月09日 10:14
  • 810

VBA常用技巧代码解析

http://club.excelhome.net/thread-395683-1-1.html
  • navy2009
  • navy2009
  • 2012年02月27日 21:22
  • 1318

Android系统常用Makefile技巧

一、重用Android.mk写法 1.源码编译一个so库libChannelSwitchDetector.so LOCAL_PATH:= $(call my-dir) include $(CLEAR...
  • tankai19880619
  • tankai19880619
  • 2014年12月17日 15:16
  • 1324

非常好的Makefile实用总结

1. Makefile 简介 http://www.cnblogs.com/wang_yb/p/3990952.html Makefile 是和 make 命令一起配合使用的. 很多大型项目的编...
  • leonliufeng
  • leonliufeng
  • 2016年10月18日 15:42
  • 955

Linux编程——makefile编写技巧大全

1. Makefile 简介 本来想自己写一些makefile的东西,但是在网上查资料时发现这篇文章,感觉写得很详细,排版也很不错,现转载过来。特此声明。 原文地址:http://www.c...
  • bad_good_man
  • bad_good_man
  • 2015年11月24日 14:47
  • 4144

Makefile中常用的一些符号

1 编译器 CC // C语言编译器,默认值为gcc CXX // C++语言编译器,默认值为g++ 说明:这是默认的变量,无需用户自定义(但是用户可以修改其值,例如CC=arm-linux-gc...
  • Q1302182594
  • Q1302182594
  • 2015年07月24日 22:43
  • 2674

Makefile 中常见自动变量和命令行选项

1.  Makefile 中常见自动变量。 命 令 格 式                       含     义 $*                      不包含扩展名的...
  • weixin_38233274
  • weixin_38233274
  • 2018年01月22日 14:54
  • 18

Oracle实用小技巧

1、 闪回 批注:delete “T_SPC_ROOM”表,但没有commit可以用以下命令还原回来。 flashback table MW_APP.T_SPC_ROOM to before d...
  • JohnnySun2015
  • JohnnySun2015
  • 2015年04月13日 08:29
  • 915

8个SQL语句常用优化技巧

要提高SQL语句的执行效率,最常见的方法就是建立索引,以及尽量避免全表扫描。在本章MySQL教程中,UncleToo给大家整理一些常见的SQL优化技巧,避免全表扫描。一个简单的优化,也许能让你的SQL...
  • csdnstudent
  • csdnstudent
  • 2014年10月23日 15:31
  • 11675

常见浏览器HACK技巧总结

IE Hack IE系列浏览器的hack大略如下: _nowamagic:1px;-----------ie6*nowamagic:1px;-----------ie7nowamagic:1p...
  • u012950186
  • u012950186
  • 2014年08月13日 15:10
  • 1074
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:makefile 常用技巧
举报原因:
原因补充:

(最多只允许输入30个字)