Theos(七):常见问题

Theos 故障排除(Theos/Troubleshooting)

在跳转到主流论坛(StackOverflow、Reddit、IRC channels)提问之前,首先请仔细阅读您的错误信息,尝试寻找可能覆盖您正在遇到的问题的通用错误。在使用上述论坛时,首先查找之前是否有人问过您遇到的问题;很有可能,您遇到的问题之前已经有人问过了!如果您已经用尽了您查询问题的所有方式,超出了谷歌特定查询的第十页,请仔细思考您遇到的问题并问自己:你明白你问的是什么吗?如果您明白您所要问的问题,则请您在上述论坛中发布您的问题

也可以考虑阅读这些文章:

  1. What have you tried?
  2. Solving your skillset problems

空的 $THEOS 环境变量或者损坏的符号链接(Empty $THEOS or corrupt symlink)

如果您收到此错误信息:

# N 代表行号
Makefile:N: theos/makefiles/common.mk: Not a directory
Makefile:N: /tweak.mk: No such file or directory

要么 $THEOS 环境变量为空,要么项目中 Theos 的符号链接指向错误的路径(即没有指向 Theos 的存储路径)

如果是 $THEOS 环境变量为空,则请运行:

# 记住在每个终端会话上都要导出此环境变量,具体方法取决于您使用的终端
export THEOS="当前平台 Theos 的存储路径"

如果是项目中 Theos 的符号链接指向了错误的路径,则在每个 Theos 符号链接损坏的目录中运行:

rm theos; ln -s $THEOS

缺少 SDK(Missing SDK)

如果您收到此错误信息:

# PPP 代表您机器当前工作的平台
".../theos/makefiles/targets/PPP/iphone.mk:21: *** first argument to 'word' function must be greater than 0. stop."

这意味着您在 $THEOS/sdks 目录中没有相应的 SDK。请参阅 此小节

SDK 体积过小(Small SDK)

如果您收到此错误信息:

# LLL 代表 SDK 文件的体积,在大多数情况下可能为 0
# X Y 代表 SDK 的版本号
# ZZZ 代表 SDK 文件的路径
# AAA 代表 CPU 架构的后缀(v6、v7、v7s、64)
ld: file too small (length=LLL) file. '.../theos/sdks/iPhoneOSX.Y.sdk/usr/ZZZ' for architecture armAAA.

这可能意味着您的 SDK 在某些方面存在问题。一个常见的错误是,在 iOS 设备上使用 Theos 时,却在 PC 上提取 SDK,然后再复制 SDK 文件到 iOS 设备中。这通常会引发提取过程中的各种错误,从而导致无法编译。相反地,应该以压缩包的形式将 SDK 复制到 iOS 设备中,并在 iOS 设备中进行提取。请不要担心这样做会花费很多时间,因为这样做会保留 SDK 文件的所有属性

默认设置(Default settings)

如果您收到此错误信息:

.../theos/makefiles/targets/Darwin-arm64/iphone.mk:43: Targeting iOS 4.0 and higher is not supported with iphone-gcc. Forcing clang.

这意味着您还没有正确地设置 TARGET 环境变量。请参阅 Theos#Theos variables

缺少 Substrate 头文件(Missing Substrate header)

如果您收到此错误信息:

# FFF 代表文件路径
# LLL 代表行号
FFF:LLL:10: fatal error: 'substrate.h' file not found
#include <substrate.h>
         ^
1 error generated.

这意味着您缺少 Substrate 的头文件(请参阅 step #6 in setting up Theos for OS X or Linux)。要解决此问题,您需要复制已越狱 iOS 设备中的 /Library/Frameworks/CydiaSubstrate.framework/Headers/CydiaSubstrate.h 到您本地 macOS 的 $THEOS/include 目录,并将其重命名为 substrate.h

缺少 Substrate 符号(Missing Substrate symbols)

如果您收到此错误信息:

# FFF 代表文件路径
# LLL 代表行号
# CCC 代表列号
FFF:LLL:CCC: error: implicit declaration of function 'MSFindSymbol' is invalid in C99 [-Werror,-Wimplicit-function-declaration]

这意味着您 Substrate 的头文件可能是旧的(请参阅 step #6 in setting up Theos for OS X or Linux)。要解决此问题,您需要复制已越狱 iOS 设备中的 /Library/Frameworks/CydiaSubstrate.framework/Headers/CydiaSubstrate.h 到您本地 macOS 的 $THEOS/include 目录,并将其重命名为 substrate.h

缺少 Substrate 动态库(Missing Substrate library)

如果您收到此错误信息:

Bootstrapping CydiaSubstrate...
Compiling iPhoneOS CydiaSubstrate stub... default target? failed, what?
cp: cannot stat ‘_out/*’: No such file or directory
cp: cannot stat ‘libsubstrate.dylib’: No such file or directory
# XXX 和 YYY 代表 CPU 架构的后缀(v6、v7、v7s、64)
ld: warning: ignoring file .../theos/lib/libsubstrate.dylib, file was built for armXXX which is not the architecture being linked (armYYY): .../theos/lib/libsubstrate.dylib

这意味着您缺少要链接的 Substrate 动态库(请参阅 step #6 in setting up Theos for OS X or Linux),或者您拥有的是旧版本的 Substrate 动态库。无论是哪种情况,从已越狱 iOS 设备中的 /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate 获取该动态库文件的最新版本,并将其复制到您本地 macOS 的 $THEOS/lib 目录,然后将其重命名为 libsubstrate.dylib

  • 有关如何解决此问题的更多详细信息(More detail about how to fix this):

    macOS 和 Linux 的用户可以使用以下命令复制文件(使用 scp program),其中 DEVICE_IP 应该替换为安装了 Substrate 动态库的已越狱 iOS 设备的 IP 地址:

    scp -P PORT root@[DEVICE_IP]:/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate $THEOS/lib/libsubstrate.dylib
    

    Windows 的用户可以使用 WinSCP 连接到已越狱 iOS 设备的 IP 地址来定位 Substrate 动态库文件,并将其复制到 Windows 的 Theos 安装中

    iOS 的用户通常没有这个问题,因为他们通常已经安装了 Substrate 动态库。然而,他们可能会有一个过时的 Substrate 动态库版本,并且需要更新它

架构(部分)不兼容 (Architecture (partial) incompatibility)

如果您在尝试运行 Theos 的 NIC(New Instance Creator)时,收到此错误信息:

Illegal instruction: 4

这可能意味着您使用的工具版本适用于旧设备,但不适用于新设备。请在此处阅读有关该问题的更多信息

它通常会影响 perlrsync(从默认源安装),因此要解决此问题,请使用 SSHMobileTerminal 在设备上以 root 身份运行这些命令:

sed -i'' 's/\x00\x30\x93\xe4/\x00\x30\x93\xe5/g;s/\x00\x30\xd3\xe4/\x00\x30\xd3\xe5/g;' /usr/bin/perl; ldid -s /usr/bin/perl
sed -i'' 's/\x00\x30\x93\xe4/\x00\x30\x93\xe5/g;s/\x00\x30\xd3\xe4/\x00\x30\xd3\xe5/g;' /usr/bin/rsync; ldid -s /usr/bin/rsync

项目路径中存在空格(Spaces in Path)

虽然即使项目的路径包含空格,通常也能构建项目;但是在 make package 时会失败。请确保您的项目路径中没有包含空格

未定义的平台(Undefined platform)

如果您收到此错误信息:

theos/makefiles/common.mk:103: *** You did not specify a target, and the "" platform does not define a default target. Stop.
theos/makefiles/common.mk:115: *** The "iphone" target is not supported on the "" platform. Stop.

这可能意味着您使用的是 Theos 不支持的平台。如果您在 64 位的设备上使用 iOS 作为平台,则您可能会得到这个错误。要解决此问题,您可以执行以下命令:

sudo ln -s $THEOS/makefiles/platform/Darwin-arm{,64}.mk
sudo ln -s $THEOS/makefiles/targets/Darwin-arm{,64}

未定义的符号(Undefined symbols)

如果您收到此错误信息:

Undefined symbols for architecture armXXX:
  "_OBJC_CLASS_$_SomeClass", referenced from:
...
ld: symbol(s) not found for architecture armXXX
...

这可能意味着您正在尝试直接使用 SomeClass 类。这通常发生在使用(二进制文件中存在的但是无法在您的 Tweak 编译中链接的)私有类时。要解决这个问题,必须在运行时动态地获取类。至少有 3 种方法可以做到:

%c(SomeClass)
objc_getClass("SomeClass")
NSClassFromString(@"SomeClass")

所以,在使用 SomeClass 类的属性或者方法时:

// 不应该使用:
[SomeClass methodOrProperty]

// 而应该使用:
[%c(SomeClass) methodOrProperty] 
[objc_getClass("SomeClass") methodOrProperty] 
[NSClassFromString(@"SomeClass") methodOrProperty]

如果上述问题中的 SomeClass 类存在于 SDK 的公有框架或者私有框架中,但是您项目 control 文件中的 XXX_FRAMEWORKS 或者 XXX_PRIVATE_FRAMEWORKS 列表中却缺少该公有框架或者私有框架

或者,收到此错误信息:

ld: warning: ignoring file /.../theos/lib/libsubstrate.dylib, missing required architecture armXXX in file /.../theos/lib/libsubstrate.dylib (2 slices)
Undefined symbols for architecture armXXX:
...
ld: symbol(s) not found for architecture armXXX

这意味着您正在使用的 Substrate 动态库不包含您正在链接的 CPU 架构。要解决此问题,您需要从已越狱 iOS 设备中的 /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate 获取 Substrate 动态库文件的最新版本,将其复制到您本地 macOS 的 $THEOS/lib 目录,然后将其重命名为 libsubstrate.dylib。有关如何修复此问题的详细信息,请参见 #Missing Substrate library 中建议的命令

不兼容的软件包压缩类型(Incompatible package compression)

在安装使用 Theos 创建的软件包时,您可能会收到此错误信息:

dpkg-deb: file `package.deb' contains ununderstood data member data.tar.xz, giving up
dpkg: error processing package.deb (--install):
 subprocess dpkg-deb --fsys-tarfile returned error exit status 2
Errors were encountered while processing:
 package.deb

这是因为 dpkg-deb 现在使用 xz 来压缩软件包,但是 Telesphoreo(一个 Cydia 源)的旧版 dpkg 不支持它。您可以使用带有命令行参数的 dpkg-deb,强制它使用 lzma 压缩:打开 $THEOS/makefiles/package/deb.mk,找到 $(FAKEROOT) -r dpkg-deb,然后在 dpkg-deb 之后添加 -Zlzma。它应该看起来像这样:

$(FAKEROOT) -r dpkg-deb -Zlzma -b ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值