Компоновщик лязга escape $ для слабого символа

#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 . Исправив это и воспользовавшись вашими советами, все заработало. Спасибо!