【已解决】如何使用 Theos 编译 Swift 源文件

说在前面

根据 Better Swift support #219 的描述,Theos 已经可以编译 Swift 文件,但是在具体开发中出现了一些问题。

过程

  1. 使用 Nic.pl 生成基础模板(均采用默认设定),然后将 Tweak.xm 更改为 Tweak.swift
  2. 自定义 Makefile 文件,具体如下:
include $(THEOS)/makefiles/common.mk

TWEAK_NAME = Sample
Sample_FILES = Tweak.swift

include $(THEOS_MAKE_PATH)/tweak.mk

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

首次编译后,产生错误:error: module file's minimum deployment target is ios7.0 v7.0

更新 Makefile 文件,具体如下:

TARGET = iphone:latest:latest

include $(THEOS)/makefiles/common.mk

TWEAK_NAME = Sample
Sample_FILES = Tweak.swift

include $(THEOS_MAKE_PATH)/tweak.mk

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

再次编译后,产生错误:error: missing required module 'os.log'

环境说明

Operating System: macOS Sierra 10.12.3 (16D32)

Platform: macOS

Target Platform: iOS

Xcode Version: 8.2.1 (8C1002)

Toolchain Version: Xcode 8.2.1

SDK Version: 10.2

附言

第一条
案例 iFinder 可做参考,但好像并不是一个有效的 Theos Swift 应用

第二条
关于 处理 Swift 运行时依赖 的方法:可以参考 FAQ - Theos 进行安装,或者更新 Makefile 去内嵌运行时文件,示例片段代码如下:

RPATH = /System/Library/CoreServices/SpringBoard.app/Frameworks
TOOLCHAIN_PATH = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain

Sample_LDFLAGS += -rpath $(RPATH)

before-stage::
	$(ECHO_NOTHING)mkdir -p $(THEOS_STAGING_DIR)$(RPATH)$(ECHO_END)
	$(ECHO_NOTHING)rsync -a $(TOOLCHAIN_PATH)/usr/lib/swift/iphoneos/libswift*.dylib $(THEOS_STAGING_DIR)$(RPATH) $(FW_RSYNC_EXCLUDES)$(ECHO_END)

解决方案

无。(属于过度配置,正常使用过程中不会出现)

示例代码
Sample.zip (170.0 KB)

1 Like

谁有兴趣可以重现一下这个问题,如果分析不出原因但是英语足够给力,也可以尝试去 Github 创建 Issue 然后放置一个链接在这里(我的书面英语实在太渣 --),又或者你有更深入的理解和参数配置!

原因:(猜测)

  1. 在 Xcode 应用里面放置了其他低版本的 SDK (9.0, 9.1, 9.2, 9.3),而这些低版本 SDK 缺失了 os.log 模块
  2. 未能正确配置 Makefile 文件,导致编译过程中使用了这些低版本 SDK

结论
删除这些低版本的 SDK 之后或者使用原装的最新版 Xcode,是可以成功编译 Swift 源文件的

你好,你最后用Theos编译通过了包含Swift文件的代码了吗,编译后的dylib能正常执行吗?用你的Sample代码编译了下,木有成功啊~~