import 双引号与尖括号的区别以及build setting 中一些 header search path 配置的说明

原创 2018年04月16日 20:33:14

import "xxx.h"的路径搜索顺序:

1. USE_HEADERMAP(如果启用,则会在映射表中查,直接跳过的header search path的配置,如果未查到,则继续往下搜索。)
2. USER_HEADER_SEARCH_PATHS
3. HEADER_SEARCH_PATHS

import <xxx.h> 的路径搜索顺序:

1. 系统路径
2. USER_HEADER_SEARCH_PATHS (ALWAYS_SEARCH_USER_PATHS 为 YES,则会搜索该路径,该变量默认是NO,并且已经被标记为Deprecated)
3. HEADER_SEARCH_PATHS

下面对上面的搜索路径做一些说明:

USE_HEADERMAP 是什么意思?

官文如下:

Use Header Maps (USE_HEADERMAP)

Enable the use of Header Maps, which provide the compiler with a mapping from textual header names to their locations, bypassing the normal compiler header search path mechanisms. This allows source code to include headers from various locations in the file system without needing to update the header search path build settings.

大致意思就是:如果启用了这个设置,那么系统会为编译器提供一个 “header名称 -> 文件路径” 的映射,这样源码中引用了的头文件就可以直接通过这个映射关系查找到对应的文件路径,这样就可以绕过编译器正常情况下的头文件搜索机制。

那么Use Header Maps的效果是怎么样的呢?下面用一个demo演示下:
新建一个 MainPrj(iOS Single View App类型),在这个项目中新建一个静态库的target XX,完毕后项目目录如下:
这里写图片描述

下面我们在 MainPrj 中的 ViewController.m 添加一句引用 #import "XX.h",此时编译是能够通过的,但是我们的主项目没有配置 HEADER_SEARCH_PATHS 和 USER_HEADER_SEARCH_PATHS,那为啥能够
找到这个头文件的?其实这里就是USE_HEADERMAP在起作用,我们可以试着把主项目中的USE_HEADERMAP配置为NO,然后就无法编译通过,会提示找不到头文件。

另外,在 Xcode help中,找到下面三个环境变量:

HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT

Specifies whether the header map contains a name/path entry for every header in the target being built.

HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES

Specifies whether the header map contains a framework-name/path entry for every header in the target being built, including targets that do not build frameworks.

HEADERMAP_INCLUDES_PROJECT_HEADERS

Specifies whether the header map contains a name/path entry for every header in the project, regardless of the headers’ target membership.

看字面说明应该是影响USE_HEADERMAP变量作用的文件范围的,不过在Xcode Build Setting中并未找到相关设置(默认是True, 可以在Build Phases
添加一个自定义脚本,脚本内容随便,然后勾选Show environment variables in build log,之后build完后,在build日志中能够找到这三个环境变量)。

ALWAYS_SEARCH_USER_PATHS

官文如下:

If enabled, both #include <header.h>-style and #include “header.h”-style directives search the paths in User Header Search Paths (USER_HEADER_SEARCH_PATHS) before Header Search Paths (HEADER_SEARCH_PATHS). As a consequence, user headers, such as your own String.h header, have precedence over system headers when using #include <header.h>. This is done using the -iquote flag for the paths provided in User Header Search Paths. If disabled and your compiler fully supports separate user paths, user headers are only accessible with #include “header.h”-style preprocessor directives.

For backwards compatibility reasons, this setting is enabled by default. Disabling it is strongly recommended.

大意是如果ALWAYS_SEARCH_USER_PATHS被设置为YES,无论#include <header.h>还是#include "header.h"的形式,都会先搜索User Header Search Paths目录。
不过这个变量已经过时了,目前还存在只是为了向后兼容,默认值都是被设置为NO。

系统路径到底是什么路径?

可以在Build Phases -> Link Binary With Libraries添加一些静态库和动态库依赖,然后Show In Finder查看具体路径。路径是下面这个样子:
$DEVELOPER_DIR/Platforms/具体的平台/Developer/SDKs/平台sdk/System/Library/
$DEVELOPER_DIR/Platforms/具体的平台/Developer/SDKs/平台sdk/usr/include

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jerryandliujie/article/details/79965969

include包含头文件的语句中,双引号和尖括号的区别

include包含头文件的语句中,双引号和尖括号的区别 #include #incluce ""格式:引用非标准库的头文件,编译器从用户的工作目录开始搜索 预处理器发现...
  • E_pen
  • E_pen
  • 2016-01-07 20:55:21
  • 4230

#include后尖括号和双引号的区别

尖括号,表示编译器只在系统默认目录或尖括号内的工作目录下搜索头文件,并不去用户的工作目录下寻找,所以一般尖括号用于包含标准库文件,例如:stdio.h,stdlib.h。      双引号"...
  • u013121305
  • u013121305
  • 2015-11-07 21:25:42
  • 1918

关于c++里面引用头文件尖括号和双引号的使用

fatal error C1083: 无法打开包括文件:“config-win.h”: No such file or directory 解决办法:...
  • u011061503
  • u011061503
  • 2013-12-03 16:26:40
  • 2330

[IOS] Xcode中 Search Paths的设置

Xcode Header Path的设置。 在 Xcode Build Setting 中 Library / Header Search Paths是一定会去搜索的。而User Header ...
  • u012703795
  • u012703795
  • 2014-04-25 12:35:10
  • 25105

iOS 开发之使用CocoaPods更新第三方出现“HEADER_SEARCH_PATHS `OTHER_LDFLAGS`……”问题解决方案

今天在自己的项目中用CocoaPods引入第三方SDWebImage的时候,出现了问题。当更新完毕后,在终端没太注意这个问题的提示,就直接使用SDWebImage了,在使用的时候一些方法的提示和头文件...
  • alincexiaohao
  • alincexiaohao
  • 2014-11-05 18:24:06
  • 1913

C++包含头文件时尖括号和双引号区别

C++已经有一些编写好的头文件(比如标准函数库等等),它们存放在VC++的Include文件夹里。当我们使用#include 命令时,编译器就到这个文件夹里去找对应的文件。显然,用这种写法去包含一个我...
  • u011959400
  • u011959400
  • 2017-03-19 14:17:37
  • 722

C++ 中include头文件尖括号<>与双引号""的区别

预处理器发现 #include 指令后,就会寻找后面跟的文件名并把这个文件的内容包含到当前文件中。被包含文件中的文本将替换源代码文件中的#include指令,就像你把被包含文件中的全部内容键入到源文件...
  • gx17864373822
  • gx17864373822
  • 2017-11-07 08:29:54
  • 131

c语言#include后的尖括号和双引号有什么区别?

1、使用尖括号的话,编译时会先在系统include目录里搜索,如果找不到才会在源代码所在目录搜索。2、使用双引号则相反,会先在源代码目录里搜索,如果未找到则去系统默认目录查找,通常用于包含程序作者编写...
  • hjy517744152
  • hjy517744152
  • 2017-07-14 17:06:15
  • 453

C++ include 双引号和尖括号的区别

#incluce ""格式: 引用非标准库的头文件,编译器从用户的工作目录开始搜索。 #include 引用标准库头文件,编译器从标准库目录开始搜索。...
  • hellokandy
  • hellokandy
  • 2016-08-02 11:51:51
  • 842

iOS之Header Search Paths和User Header Search Paths和library searchpath

XCode用户可以 通过Header Search Paths 来配置环境变量。但这里涉及到一个另外一个参数 User Header Search Paths, 这两者到底有什么区别呢? ...
  • u011146511
  • u011146511
  • 2017-08-15 18:47:05
  • 1168
收藏助手
不良信息举报
您举报文章:import 双引号与尖括号的区别以及build setting 中一些 header search path 配置的说明
举报原因:
原因补充:

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