@import Module(ObjC) 或语义导入
历史:
#include => #import => Precompiled Headers .pch => @import Module(ObjC); => import Module(Swift)
[#include vs #import]
[Precompiled Headers .pch]
[import Module(Swift)]
它是LLVM Modules的一部分
@import <module_name>; 声明告诉编译器加载(而不是编译)一个预编译模块的二进制文件,它减少构建时间。以前编译器每次运行时都会编译依赖项,但现在应该预先编译并加载
//previously
run into dependency -> compile dependency
run into dependency -> compile dependency
//@import
compile dependency
run into dependency -> load compiled binary
run into dependency -> load compiled binary
[Modulemap] - 模块和头文件之间的桥梁
Xcode
Enable Modules(C and Objective-C)(CLANG_ENABLE_MODULES) - CLANG #include, #import 指令会自动转换为 @import,从而带来所有优势。 Modulemap 允许无缝执行,因为包含标题和子/模块之间的映射
通过-fmodules
#include, #import -> @import
Link Frameworks Automatically(CLANG_MODULES_AUTOLINK) - 启用 system 模块自动链接。需要激活CLANG_ENABLE_MODULES。自动链接允许基于#import, @import(Objective-C), import(Swift) 传递-framework <framework_name>
如果否 - 传递 -fno-autolink 标志
如果您想手动处理系统(#import <UIKit/UIKit.h>)链接(而不是自动链接),您有两种变体:
-
将依赖添加到General -> Frameworks and Libraries or Frameworks, Libraries, and Embedded Content
-
Build Settings -> Other Linker Flags(OTHER_LDFLAGS) -> -framework <module_name>
如果出现以下情况,则引发下一个错误:
-
CLANG_ENABLE_MODULES 已禁用
-
CLANG_MODULES_AUTOLINK 已禁用且无法手动链接
Undefined symbol: _OBJC_CLASS_$_UIView
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_UIView", referenced from:
objc-class-ref in ClassB.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1
逆向工程
otool -l <binary>
//-l print the load commands
//find LC_LINKER_OPTION
//cmd LC_LINKER_OPTION