#objective-c #makefile #linker #clang #gnu-make
Вопрос:
Я использую Теос для настройки, но у меня возникли проблемы с файлами создания и флагами компоновщика.
Компоновщик жалуется на неопределенный символ, который я так пытаюсь выдать -Wl,-U, _OBJC_CLASS_$_Hook_HTTestClass
за слабо связанный символ, подобный этому,
ARCHS = arm64
TARGET := iphone:clang:latest:7.0
INSTALL_TARGET_PROCESSES = HookTest
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = HookTestTweak
HookTestTweak_FILES = Tweak.m
HookTestTweak_CFLAGS = -fobjc-arc
HookTestTweak_LDFLAGS = -v -Wl,-U,_OBJC_CLASS_$_Hook_HTTestClass
include $(THEOS_MAKE_PATH)/tweak.mk
Сначала я подумал, что это из-за $, поэтому попытался сбежать от этого.
HookTestTweak_LDFLAGS = -v -Wl,-U,_OBJC_CLASS_$_Hook_HTTestClass
Но компоновщик просто приводит к этому (обратите внимание, как он говорит -U _OBJC_CLASS_
),
"/home/haow6/.theos/toolchain/linux/iphone/bin/ld" -dynamic -dylib -arch arm64 -dylib_install_name /Library/MobileSubstrate/DynamicLibraries/HookTestTweak.dylib -platform_version ios 7.0.0 14.4 -multiply_defined suppress -syslibroot /home/haow6/.theos/sdks/iPhoneOS14.4.sdk -o /home/haow6/source/HookTest/HookTestTweak/.theos/obj/debug/arm64/HookTestTweak.dylib -L/home/haow6/.theos/lib -L/home/haow6/.theos/vendor/lib -lobjc -framework Foundation -framework CoreFoundation -framework CydiaSubstrate -lc -U _OBJC_CLASS_ /home/haow6/source/HookTest/HookTestTweak/.theos/obj/debug/arm64/Tweak.m.bd8afb95.o -lc -lSystem -F/home/haow6/.theos/vendor/lib
Undefined symbols for architecture arm64:
"_OBJC_CLASS_$_HTTestClass", referenced from:
_OBJC_CLASS_$_Hook_HTTestClass in Tweak.m.bd8afb95.o
"_OBJC_METACLASS_$_HTTestClass", referenced from:
_OBJC_METACLASS_$_Hook_HTTestClass in Tweak.m.bd8afb95.o
ld: symbol(s) not found for architecture arm64
Затем я попытался заключить название символа в кавычки и приблизить -U "_OBJC_CLASS_$_Hook_HTTestClass"
его, но это все равно не работает,
"/home/haow6/.theos/toolchain/linux/iphone/bin/ld" -dynamic -dylib -arch arm64 -dylib_install_name /Library/MobileSubstrate/DynamicLibraries/HookTestTweak.dylib -platform_version ios 7.0.0 14.4 -multiply_defined suppress -syslibroot /home/haow6/.theos/sdks/iPhoneOS14.4.sdk -o /home/haow6/source/HookTest/HookTestTweak/.theos/obj/debug/arm64/HookTestTweak.dylib -L/home/haow6/.theos/lib -L/home/haow6/.theos/vendor/lib -lobjc -framework Foundation -framework CoreFoundation -framework CydiaSubstrate -lc -U "_OBJC_CLASS_$_Hook_HTTestClass" /home/haow6/source/HookTest/HookTestTweak/.theos/obj/debug/arm64/Tweak.m.bd8afb95.o -lc -lSystem -F/home/haow6/.theos/vendor/lib
Undefined symbols for architecture arm64:
"_OBJC_CLASS_$_HTTestClass", referenced from:
_OBJC_CLASS_$_Hook_HTTestClass in Tweak.m.bd8afb95.o
"_OBJC_METACLASS_$_HTTestClass", referenced from:
_OBJC_METACLASS_$_Hook_HTTestClass in Tweak.m.bd8afb95.o
ld: symbol(s) not found for architecture arm64
Я мог бы использовать -Wl,-undefined,dynamic_lookup
, но он жалуется, что он устарел.
Я надеюсь, что я на правильном пути, но любая помощь была бы очень признательна!
Ответ №1:
$
Персонаж особенный как для создания, так и для оболочки, поэтому вам придется сбежать от него дважды, по одному разу для каждого.
Ибо make
вы удваиваете его, $$
чтобы избежать этого. Для оболочки вы включаете ее в одинарные кавычки. Так что попробуй:
HookTestTweak_LDFLAGS = -v '-Wl,-U,_OBJC_CLASS_$_Hook_HTTestClass'
Комментарии:
1. Тот же результат в примере с кавычками,
-U "_OBJC_CLASS_$_Hook_HTTestClass"
2. о боже, я допустил опечатку. символа
_OBJC_CLASS_$_HTTestClass
нет_OBJC_CLASS_$_Hook_HTTestClass
. Исправив это и воспользовавшись вашими советами, все заработало. Спасибо!