xcconfig(环境变量) 的使用
文章目录
- xcconfig(环境变量) 的使用
- 一、上手使用
- 1、添加 xcconfig 文件
- 2、在文件中添加数据
- 3、将文件配置到工程中
- 4、使用环境变量
- 5、使用 Pod 的项目
- 二、语法
- 1、注释:
- 2、包含语句:
- 3、变量
- 4、变量分配
- 5、重写
- 6、继承
- 三、相关概念
- workspace
- project
- target
- configuration & build settings
- scheme
- 四、常见环境变量
- 五、build Settings 常见参数
- 六、OBJC 环境变量
- 参考
一、上手使用
1、添加 xcconfig 文件
一般需要添加 Release 和 Debug 版本,这两者公用的数据,也可以添加一个通用的文件,比如我这里通用的叫做 Config.xcconfig
2、在文件中添加数据
字符串不需要加 引号
对通用文件的引用,使用 #include
3、将文件配置到工程中
可以通过终端查看所有 build setting,比如本项目中数据如下
$ cd /Users/dv/Desktop/XcconfigDemo
$ xcodebuild -list
Information about project "XcconfigDemo":
Targets:
XcconfigDemo
Build Configurations:
Debug
Release
If no build configuration is specified and -scheme is not passed then "Release" is used.
Schemes:
XcconfigDemo
获取项目中的所有配置(包含默认配置),并输出
$ xcodebuild -showBuildSettings
$ xcodebuild -project HelloWorld.xcodeproj -target HelloWorld -configuration Debug -showBuildSettings > xcodebuild_showBuildSettings.txt
$ xcodebuild -scheme "XcconfigDemo" -showBuildSettings >> mynew.xcconfig # 查看指定 scheme 的环境变量
4、使用环境变量
这里我将名字使用环境变量来显示
运行起来后,应用的名字变成了我们想要的结果。
5、使用 Pod 的项目
pod 也是使用 xcconfig 来管理配置,可以看工程中 Pods 下面的 Targets Support Files
文件夹。
引入了 pod 的项目,默认的 Configurations 为 pod 的 xcconfig;
为了不影响 pod 的使用,需要在我们的 xcconfig 的debug 和 release 中分别引入,方法如下
#include "Pods/Target Support Files/Pods-XcconfigDemo/Pods-XcconfigDemo.debug.xcconfig"
其它疑问
-
环境变量的数据类型是什么呢?
-
如何在代码中使用环境变量呢?
一种写法是:
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) kHostDefault='$(kHostDefault)' kHostAlpha='$(kHostAlpha)' kHostAlphaBox='$(kHostAlphaBox)' kLIVE_SKD_APPKEY='$(kLIVE_SKD_APPKEY)' kBUGLY_ID='$(kBUGLY_ID)' kUM_CHANNEL_ID='$(kUM_CHANNEL_ID)' kUM_APPKEY='$(kUM_APPKEY)'
-
如何在 xib 的配置中使用环境变量呢?
二、语法
1、注释:
- 没有多行注释
- 单行注释以
//
开头。
2、包含语句:
- 以
#include
开头,后面添加文件路径。#include "Debug.xcconfig"
- 多层路径的#include:
#include "/Makefiles/CoreOS/Xcode/BSD.xcconfig"
3、变量
- 开始以
_
、大写字母或者小写字母,可以含有:_
、0~9
、a~z
、A~Z
。 - 在两个变量名或者变量与值之间使用
=
。
4、变量分配
- 如果想使用变量默认值,就不用在此变量的
=
后面添加任何值。
5、重写
// Variable set in the project file
OTHER_LDFLAGS = -ObjC
// lib.xcconfig
OTHER_LDFLAGS = -framework Security
编译时,OTHER_LDFLAGS 会是-framework Security
, -ObjC 会被 -framework Security 重写。
6、继承
// Variable set in the project file
OTHER_LDFLAGS = -ObjC
// lib.xcconfig
OTHER_LDFLAGS = $(inherited) -framework Security
编译时,OTHER_LDFLAGS 会是-ObjC -framework Security
三、相关概念
workspace
workspace,顾名思义就是我们的工作区。一个workspace可以包含多个project以及一些其它文件。workspace也可以把多可以project组织起来。
project
一个 project 会包含属于这个项目的所有文件,资源,以及生成一个或者多个软件产品的信息。
target
一个project会包含一个或者多个 target,而每一个 target 都对应一个products,也就是最终产生的.app。
configuration & build settings
一个 targets 可以有多个 configuration(如我们平常用到的 debug 和 release,当然我们还可以自己添加),每个configuration 就会有对应的 build settings。每次build都是在一个configuration下build的。
build setting 中包含了 product 生成过程中所需的参数信息。project的build settings会对于整个project 中的所有targets生效,而target的build settings是重写了project的build settings,重写的配置以target为准。
scheme
那么,什么又是scheme呢?scheme就相当于一个组织者。在build的时候,schema会指定一个target和configuration,这样就能保证在build的时候configuration的唯一性,就能产生一个特定的product。
四、常见环境变量
$(TARGET_NAME)
目标工程名称
$(BUILT_PRODUCTS_DIR)
最终产品路径
build成功后的,最终产品路径--可以在Build Settings参数的Per-configuration Build Products Path项里设置
$(SRCROOT)
工程文件(比如Nuno.xcodeproj)的路径
$(CURRENT_PROJECT_VERSION)
当前工程版本号
$(PRODUCT_NAME)
product name,产品名字
$(PRODUCT_BUNDLE_IDENTIFIER)
Framework/Library Search Paths
表示framework和Library引用的路径,改路径是你工程下的绝对路径
$(SRCROOT)
工程文件目录,表示你的XXX.xcodeproj文件的目录,而你引用的framework和 Library相对xxxx.xcodeproj文件的目录就可以直接添加在$(SRCROOT)/后面了。
例如 $(SRCROOT)/Find/who.framework
表示who.framework文件是在你的工程xxxx.codeproj下的一个Find文件夹下。
$(EFFECTIVE_PLATFORM_NAME)
宏代表当前配置是OS还是simulator
4.一般情况下是不用特意去设置这些Search Paths的万一路径错了,就将你的framework和Library文件重新引用一遍就可以了,xcode 会自动设置这些路径的。
//以下的“=”表示右边的表达式就是左边表达式的值!
$(BUILD_DIR)
$(BUILD_DIR) = /Users/xxx/Library/Developer/Xcode/DerivedData/xxxWorkspace-caepeadwrerdcrftijaolkkagbjf/Build/Products
表示程序编译后的路径,一般是表示在 Xcode 的 DerivedData 文件夹下编译后你的工程为xxxWorkspace-caepeadwrerdcrftijaolkkagbjf
说明:$(BUILD_DIR)是不能通过build Setting改变的,而下面的都是可以通过build Setting来改变他们的值的,以下都是默认情况下,主要是为了说明宏的意思
$(SDK_NAME)
$(SDK_NAME)=iphonesimulator5.0 表示获取当前SDK的名字
$(PLATFORM_NAME)
= iphonesimulator 表示获取当前程序运行的平台
$(TARGET_NAME)
$(TARGET_NAME) = UtilLib 表示工程文件名UtiLib
-
$(EXECUTABLE_NAME)
$(EXECUTABLE_NAME)
= libUtilLib.a,表示可执行文件libUtiLib.a
$(ACTION)
$(ACTION) = build表示当前操作是编译操作
$(CURRENTCONFIG_SIMULATOR_DIR)
表示当前模拟器路径
$(CURRENTCONFIG_DEVICE_DIR)
表示当前设备路径
${CONFIGURATION}
表示当前状态是调试Debug还是运行状态release
${CONFIGURATION}
${CONFIGURATION}-iphoneos 表示:Debug-iphoneos(如果当前模式是Debug)
$(BUILD_DIR)
$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME =/Users/xxx/Library/Developer/Xcode/DerivedData/xxxWorkspace-caepeadwrerdcrftijaolkkagbjf/Build/Products/Debug-iphonesimulator
表示在模拟器的调试状态下
$(CURRENTCONFIG_DEVICE_DIR)
当然也可以自己定义路径,比如当前设备路径
$(CURRENTCONFIG_DEVICE_DIR) = ${SYMROOT}/${CONFIGURATION}-iphoneos
其中
${SYMROOT}
/Users/xxx/Library/Developer/Xcode/DerivedData/xxxWorkspace-caepeadwrerdcrftijaolkkagbjf/build/products 目录
$(CREATING_UNIVERSAL_DIR)
$(CREATING_UNIVERSAL_DIR) = /Users/xxx/Library/Developer/Xcode/DerivedData/xxxWorkspace-caepeadwrerdcrftijaolkkagbjf/Build/Products/Debug-universal
$(BUILT_PRODUCTS_DIR)
$(BUILT_PRODUCTS_DIR) = /Users/xxx/Library/Developer/Xcode/DerivedData/xxxWorkspace-caepeadwrerdcrftijaolkkagbjf/Build/Products/Debug-iphonesimulator
表示程序编译后的目录
$(inherited)
Project 的 Building Settings 中的设置 默认并不被 Targets 继承,只有当Targets的设置加入了 (inherited)
时才被继承,添加目录的时候写上(inherited)
就表示从 frameworks 里面读取。
继承自更高一级的配置
-》
由到高低的配置,分别是:
Basic的Project中的配置-》此处的Target的配置-》具体的Debug还是Release的配置
五、build Settings 常见参数
- Installation Directory:安装路径
静态库编译时,Build Settings中Installation Directory 设置为$(BUILT_PRODUCTS_DIR)
Skip Install 设为YES,因为Installation Directory默认为/usr/local/lib
,Skip Install 如果是NO,可能会被安装到默认路径/usr/local/lib
- Public Headers Folder Path:对外公开头文件路径
如果设为“include”(具体的头文件路径为:$(BUILT_PRODUCTS_DIR)/include/xx.h
)
在最终文件.a同级目录下生成一个include目录
默认:/usr/local/include
Public Headers Folder Path这个路径就是使用这lib的某工程需要依赖的外部头文件.导入这路径后,#include/import “xx.h” 才能看到 - User Header Search Paths:依赖的外部头文件搜索路径
如果设置为$(BUILT_PRODUCTS_DIR)/include
和2中路径对应 - Per-configuration Build Products Path:最终文件路径
比如设为../app
,就会在工程文件.xcodeproj上一层目录下的app目录里,创建最终文件
默认为$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
等于$(BUILT_PRODUCTS_DIR)
- Per-configuration Intermediate Build Files Path:临时中间文件路径
默认为:$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
- Code Signing Identity:真机调试的证书选择
选一个和Bundle identifier相对应的证书 - Library Search Paths:库搜索路径
- Architectures:架构,设为 armv6 或 armv7
- Valid Architectures:应用框架,可以设为 armv6、 armv7 或i386
- Product Name:工程文件名,默认为$(TARGET_NAME)
- Info.plist File:info文件路径
- Build Variants:默认为normal
- Other Linker Flags:其他链接标签,设为
-ObjC
当导入的静态库使用了类别,需要设为-ObjC
- iOS Deployment Target:iOS部署对象,比如可以选择设为,ios3到ios5的一种版本
- Prefix Header:预编头文件(比如:UtilLib/UtilLib-Prefix.pch)
- Precompile Prefix Header:设为“Yes”,表示允许加入预编译头
六、OBJC 环境变量
变量名 | 介绍 | 备注 |
---|---|---|
OBJC_PRINT_OPTIONS | list which options are set | 输出OBJC已设置的选项 |
OBJC_PRINT_IMAGES | log image and library names as they are loaded | 输出已load的image信息 |
OBJC_PRINT_LOAD_METHODS | log calls to class and category +load methods | 打印 Class 及 Category 的 + (void)load 方法的调用信息 |
OBJC_PRINT_INITIALIZE_METHODS | log calls to class +initialize methods | 打印 Class 的 + (void)initialize 的调用信息 |
OBJC_PRINT_RESOLVED_METHODS | log methods created by +resolveClassMethod and +resolveInstanceMethod: | 打印通过 +resolveClassMethod: 或 +resolveInstanceMethod: 生成的类方法 |
OBJC_PRINT_CLASS_SETUP | log progress of class and category setup | 打印 Class 及 Category 的设置过程 |
OBJC_PRINT_PROTOCOL_SETUP | log progress of protocol setup | 打印 Protocol 的设置过程 |
OBJC_PRINT_IVAR_SETUP | log processing of non-fragile ivars | 打印 Ivar 的设置过程 |
OBJC_PRINT_VTABLE_SETUP | log processing of class vtables | 打印 vtable 的设置过程 |
OBJC_PRINT_VTABLE_IMAGES | print vtable images showing overridden methods | 打印 vtable 被覆盖的方法 |
OBJC_PRINT_CACHE_SETUP | log processing of method caches | 打印方法缓存的设置过程 |
OBJC_PRINT_FUTURE_CLASSES | log use of future classes for toll-free bridging | 打印从 CFType 无缝转换到 NSObject 将要使用的类(如 CFArrayRef 到 NSArray * ) |
OBJC_PRINT_GC | log some GC operations | 打印一些垃圾回收操作 |
OBJC_PRINT_PREOPTIMIZATION | log preoptimization courtesy of dyld shared cache | 打印 dyld 共享缓存优化前的问候语 |
OBJC_PRINT_CXX_CTORS | log calls to C++ ctors and dtors for instance variables | 打印类实例中的 C++ 对象的构造与析构调用 |
OBJC_PRINT_EXCEPTIONS | log exception handling | 打印异常处理 |
OBJC_PRINT_EXCEPTION_THROW | log backtrace of every objc_exception_throw() | 打印所有异常抛出时的 Backtrace |
OBJC_PRINT_ALT_HANDLERS | log processing of exception alt handlers | 打印 alt 操作异常处理 |
OBJC_PRINT_REPLACED_METHODS | log methods replaced by category implementations | 打印被 Category 替换的方法 |
OBJC_PRINT_DEPRECATION_WARNINGS | warn about calls to deprecated runtime functions | 打印所有过时的方法调用 |
OBJC_PRINT_POOL_HIGHWATER | log high-water marks for autorelease pools | 打印 autoreleasepool 高水位警告 |
OBJC_PRINT_CUSTOM_RR | log classes with un-optimized custom retain/release methods | 打印含有未优化的自定义 retain/release 方法的类 |
OBJC_PRINT_CUSTOM_AWZ | log classes with un-optimized custom allocWithZone methods | 打印含有未优化的自定义 allocWithZone 方法的类 |
OBJC_PRINT_RAW_ISA | log classes that require raw pointer isa fields | 打印需要访问原始 isa 指针的类 |
OBJC_DEBUG_UNLOAD | warn about poorly-behaving bundles when unloaded | 卸载有不良行为的 Bundle 时打印警告 |
OBJC_DEBUG_FRAGILE_SUPERCLASSES | warn about subclasses that may have been broken by subsequent changes to superclasses | 当子类可能被对父类的修改破坏时打印警告 |
OBJC_DEBUG_FINALIZERS | warn about classes that implement -dealloc but not -finalize | 警告实现了 -dealloc 却没有实现 -finalize 的类 |
OBJC_DEBUG_NIL_SYNC | warn about @synchronized(nil), which does no synchronization | 警告 @synchronized(nil) 调用,这种情况不会加锁 |
OBJC_DEBUG_NONFRAGILE_IVARS | capriciously rearrange non-fragile ivars | 打印突发地重新布置 non-fragile ivars 的行为 |
OBJC_DEBUG_ALT_HANDLERS | record more info about bad alt handler use | 记录更多的 alt 操作错误信息 |
OBJC_DEBUG_MISSING_POOLS | warn about autorelease with no pool in place, which may be a leak | 警告没有 pool 的情况下使用 autorelease,可能内存泄漏 |
OBJC_DEBUG_DUPLICATE_CLASSES | halt when multiple classes with the same name are present | 当出现类重名时停机 |
OBJC_USE_INTERNAL_ZONE | allocate runtime data in a dedicated malloc zone | 在一个专用的 malloc 区分配运行时数据 |
OBJC_DISABLE_GC | force GC OFF, even if the executable wants it on | 强行关闭自动垃圾回收,即使可执行文件需要垃圾回收 |
OBJC_DISABLE_VTABLES | disable vtable dispatch | 关闭 vtable 分发 |
OBJC_DISABLE_PREOPTIMIZATION | disable preoptimization courtesy of dyld shared cache | 关闭 dyld 共享缓存优化前的问候语 |
OBJC_DISABLE_TAGGED_POINTERS | disable tagged pointer optimization of NSNumber et al. | 关闭 NSNumber 等的 tagged pointer 优化 |
OBJC_DISABLE_NONPOINTER_ISA | disable non-pointer isa fields | 关闭 non-pointer isa 字段的访问 |
参考
- xcode的环境变量,Build Settings参数,workspace及联编设置
https://blog.csdn.net/itianyi/article/details/23852133 - 陈兴Startry:iOS开发必备–环境变量配置(Debug & Release)
http://www.cocoachina.com/articles/13869 - The Unofficial Guide to xcconfig files
https://pewpewthespells.com/blog/xcconfig_guide.html
https://www.jianshu.com/p/aad1f9e72382
http://www.cocoachina.com/ios/20141225/10761.html
伊织 2020-02-24