makefile

发布时间:2019-06-14 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了makefile脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

前言

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

其本质都是在“文件依赖性”上做文章

Makefile 文件制定编译和链接所涉及的文件、框架、库等信息,将整个过程自动化

0.1 关于程序的编译和链接

一般来说,无论是C、C++、还是pas,首先要把文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。

  • 编译时,

编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。

  • 链接时

      ,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。
      
      
      
    

在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。

  • 总结一下

,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),

1 Makefile 介绍

make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。

1.1 Makefile的规则

在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则。

    target... : PRerequisITes ...
          command
          ...
          ...
         -------------------------------------------------------------------------------
THEOS_DEVICE_IP=iphone150    #5C9
TARGET = iphone:latest:8.0
ARCHS = armv7 arm64
THEOS=/opt/theos
THEOS_MAKE_PATH=$(THEOS)/makefiles
include $(THEOS)/makefiles/common.mk

TWEAK_NamE = Taoke
TWEAK_NAME_FILES = Taoke.XM

TWEAK_NAME_FRAMEWORKS = UIKit, Foundation, Security, IOKit, JavaScriptCore
ADDITIONAL_CCFLAGS  = -Qunused-arguments
ADDITIONAL_LDFLAGS  = -Wl,-segalign,4000
ADDITIONAL_CFLAGS = -Werror -Wobjc-method-access

include $(THEOS_MAKE_PATH)/tweak.mk

after-install::
    install.exec "echo '' > /var/log/syslog"
    install.exec "killall -9 WeChat"
    install.exec "killall -9 Moon"
  • target也就是一个目标文件,可以是Object
    File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。

         prerequisites就是,要生成那个target所需要的文件或是目标。
         command也就是make需要执行的命令。(任意的Shell命令)
    

prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则

命令——“make clean”,以此来清除所有的目标文件,以便重编译。

例子:

ARCHS = armv7 arm64
TARGET = iphone:latest:7.0

include theos/makefiles/common.mk

TWEAK_NAME = iOSREProject
iOSREProject_FILES = Tweak.mk
iOSREProject_PRIVATE_FRAMEWORK = BaseBoard
incluce $(THEOS_MAKE_PATH)/tweak.mk

after-install:: install.exec "killall -9 SpringBoard"

因为BaseBoard这个private framework只存在于8.0以上的版本的SDK中,在IOS7 里并没有,所以这个tweak在IOS 7 中因为不会找到framework 而无法进行工作。这种情况可以通过弱引用(谷歌搜索 “makefile weak linking”)或dloPEn()、dlsym() 和 dlclose()系列函数动态调用private framework来解决。

链接Match-o对象(Match-O object)

iOSREProject_LDFLAGS = -lx

heos 采用GUN Linker来链接Mach-O对象,包括.dylib、 .a 和 .o 。
这样,链接Mach-O对象就很方便了,例如,要链接libSQLite3.0.dylib 、libz.dylib 和dylib1.0像下面这样写就OK

iOSREProject_LDFLAGS = -lz -lsqlite3.0 -dylib1.o 

使用 ASIHTTPRequest 的例子

 20 RESOURCE_DIR = Resources
#编译 ----------------------------ASIHTTPRequest--------------------
 32 service_FILES += ASIHTTPRequest/ASIAuthenticationDialog.m
 33 service_FILES += ASIHTTPRequest/ASIDownloadCache.m
 34 service_FILES += ASIHTTPRequest/ASIFormDataRequest.m
 35 service_FILES += ASIHTTPRequest/ASIHTTPRequest.m
 36 service_FILES += ASIHTTPRequest/ASIInputStream.m
 37 service_FILES += ASIHTTPRequest/ASinetworkQueue.m
 38 service_FILES += ASIHTTPRequest/Reachability.m
 39 
 40 #编译 ----------------------------Encoder---------------------------
 41 service_FILES += Encoder/CrypHelper.m
 42 service_FILES += Encoder/GTMBase64.m
 43 service_FILES += Encoder/NSData+Base64.m
 44 service_FILES += Encoder/NSString+MD5Addition.m
 45 service_FILES += Encoder/UIDevice+IdentifierAddition.m
 46 
 47 #编译 ----------------------------TBXML-----------------------------
 48 service_FILES += TBXML/NSDataAdditions.m
 49 service_FILES += TBXML/TBXML.m
 50 
 51 #编译 ----------------------------Regex-----------------------------
 52 service_FILES += Regex/RegexKitLite.m
 53 
 54 #编译 ----------------------------Constant--------------------------
 55 service_FILES += Constant/Constant.m
 56 service_FILES += Constant/Userdefaults.m
 57 

#连接单元
 87 #
 88 #连接 ----------------------------framework--------------------------
 89 service_FRAMEWORKS = Foundation UIKit QuartzCore Foundation CoreFoundation CoreGraphics  mobileCoreServices
 90 service_FRAMEWORKS += Systemconfiguration  CFNetwork CoreTelephony CoreLocation MapKit
 91 
 92 
 93 #连接 ----------------------------dylib------------------------------
 94 service_LDFLAGS = -lxml2 -lz -licucore -lgcc -lgcc_eh -lstdc++ 
 95 service_LDFLAGS += -L./BaiduMap/inc -R./BaiduMap/inc/ -lbaidumapapi
 96 
 97 #编译器 ----------------------------------------------------------
 98 #service_CFLAGS += -std=c99 
 99 #service_CFLAGS += -all_load
100 
101 #资源文件 ----------------------------------------------------------
102 internal-package::
103    ifneq ($(wildcard $(RESOURCE_DIR)/*.png), )
104     mkdir -p $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)
105     cp $(RESOURCE_DIR)/*.png $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)/
106    endif
107    ifneq ($(wildcard $(RESOURCE_DIR)/*.lproj), )
108     mkdir -p $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)
109     rsync -avC $(RESOURCE_DIR)/*.lproj $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)
110    endif
111    ifneq ($(wildcard $(RESOURCE_DIR)/$(TWEAK_NAME).plist), )
112     mkdir -p $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)
113     cp $(RESOURCE_DIR)/$(TWEAK_NAME).plist $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)
114    endif
115 

参考文章

   20行存放资源文件的本地目录名称:可以自定义 主要是在生成包拷贝时使用
CFLAGS: 指定头文件(.h文件)的路径,如:CFLAGS=-I/usr/include -I/path/include

 TWEAK_NAME_CFLAGS += -I./include
有时候LDFLAGS指定-L虽然能让链接器找到库进行链接,但是运行时链接器却找不到这个库,如果要让软件运行时库文件的路径也得到扩展,那么我们需要增加这两个库给"-Wl,R":

LDFLAGS = -L/var/xxx/lib -L/opt/MySQL/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib

小结

# 系统配置部分    export THEOS=/opt/theos/
#   RESOURCE_DIR = Resources  存放资源文件的本地目录名称:可以自定义 主要是在生成包拷贝时使用  #资源文件 ----------------------------------------------------------102 internal-package::
# 调试设备的IP地址
THEOS_DEVICE_IP=iphone150    #5C9
TARGET = iphone:latest:8.0
ARCHS = armv7 arm64
THEOS=/opt/theos
THEOS_MAKE_PATH=$(THEOS)/makefiles
# 引入常用的一般模板
include $(THEOS)/makefiles/common.mk
# 工程名称
TWEAK_NAME =
# :常用的一个宏设置是否显示NSLog 区分是debug还是release 也可以自己尝试设置其他宏变量
DEBUG = 0

# 编译所需要的的源文件
Taoke_FILES = Taoke.xm 
# sdk中的framework
Taoke_FRAMEWORKS = UIKit, Foundation
#CXXFLAGS 表示用于 C++ 编译器的选项。
ADDITIONAL_CCFLAGS  = -Qunused-arguments
# gcc等编译器会用到的一些优化参数 也可以在里面指定库文件的位置;例如需要的一些系统静态库和第三方静态库 例如,要链接libsqlite3.0.dylib 、libz.dylib 和dylib1.0  TWEAK_NAME_LDFLAGS = -lz -lsqlite3.0 -dylib1.o   或者使用TWEAK_NAME_OBJ_FILES += libcurl.a  指定库文件的位置的用法:LDFLAGS=-L/usr/lib -L/path/to/your/lib -WL,R 运行时库文件的路径也得到扩展-Wl,R/var/xxx/lib
ADDITIONAL_LDFLAGS  = -Wl,-segalign,4000
# CFLAGS 表示用于 C 编译器的选项, 际上涵盖了编译和汇编两个步骤 编译器参数设置 #service_CFLAGS += -std=c99  #service_CFLAGS += -all_load   redRobert_CFLAGS += -Wno-error 忽略的编译错误  TWEAK_NAME_CFLAGS += -I./include
ADDITIONAL_CFLAGS = -Werror -Wobjc-method-access
# 引入tweak模板
include $(THEOS_MAKE_PATH)/tweak.mk

after-install::
    install.exec "echo '' > /var/log/syslog"
    install.exec "killall -9 WeChat"
    install.exec "killall -9 Moon"

脚本宝典总结

以上是脚本宝典为你收集整理的makefile全部内容,希望文章能够帮你解决makefile所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。