Ich habe gesehen, dass es einige Themen mit der "Umwandlung von Objective-C-Zeiger Typ 'NSString *' zu C-Zeiger Typ ' CFStringRef '"Problem gelöst, aber mein Fall ist etwas anders.Weird Cast von Objective-C-Zeiger Typ 'NSString *' zu C-Zeiger Typ 'CFStringRef' Fehler
Ich mache einige iOS Cross-Compilierung von Linux und ich habe einen lokalen Desktop-PC mit Ubuntu, wo ich es schaffen, ohne Probleme alle meine Code kompilieren. Wenn ich versuche, dies zu Port in eine AWS Maschine ich die folgenden Kompilierung Fehler:
„Cast von Objective-C Zeigertyp‚NSString *‘bis C Zeigertyp‚CFStringRef‘“ auf diesem Code:
- (NSString *)stringByEscapingQueryString:(NSString *)string { return (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)string, NULL, (CFStringRef) @":/?#[]@!$&'()*+,;=", kCFStringEncodingUTF8)); }
die folgende Zusammenstellung Befehl:
arm-apple-darwin11-clang -v -E -I/home/ubuntu/source/common -I/home/ubuntu/source/ios -I/home/ubuntu/source/posix -I/home/ubuntu/generated_include -fmessage-length=0 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit=0 -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wno-return-type -Wno-implicit-atomic-properties -Wno-arc-repeated-use-of-weak -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wno-unused-variable -Wunused-value -Wno-empty-body -Wno-uninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wno-constant-conversion -Wno-int-conversion -Wno-bool-conversion -Wno-enum-conversion -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementations -fstrict-aliasing -Wprotocol -Wno-sign-conversion -Wno-infinite-recursion -Wmost -Wno-four-char-constants -Wno-unknown-pragmas -fmessage-length=0 -fdiagnostics-show-note-include-stack -Wno-infinite-recursion -Wmost -w -fmessage-length=0 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit=0 -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wno-return-type -Wno-implicit-atomic-properties -Wno-arc-repeated-use-of-weak -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wno-unused-variable -Wunused-value -Wno-empty-body -Wno-uninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wno-constant-conversion -Wno-int-conversion -Wno-bool-conversion -Wno-enum-conversion -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementations -fstrict-aliasing -Wprotocol -Wno-sign-conversion -Wno-infinite-recursion -Wmost -Wno-four-char-constants -Wno-unknown-pragmas -fmessage-length=0 -fdiagnostics-show-note-include-stack -Wno-infinite-recursion -Wmost -w -DW_DEBUG=1 -fvisibility=hidden -DBUILD_VARIATION=DEV -DFF_DEBUG_STRING_ID=1 -DFF_CRASH_HANDLING=1 -DGTEST_USE_OWN_TR1_TUPLE=1 -DENGINE_PLATFORM_IOS=1 -DUSECPP11=1 -miphoneos-version-min=6.0 -Wfatal-errors -Wno-return-type -g -arch arm64 -isysroot /home/ubuntu/ios-linux-cross-compile/cctools-port/usage_examples/ios_toolchain/target/SDK/iPhoneOS10.2.sdk -o BFAppLinkNavigation.m.o -c /home/ubuntu/source/ios/BFAppLinkNavigation.m
Was ist das interessant ist, ist die folgende:
- Beide Maschinen exakt gleiche LLVM/Clang Version haben: 3.9.1 ~ ~ svn288847-1 exp1
- Beide Maschinen verwenden genau das gleiche SDK (iPhoneOS10.2.sdk) - Wenn ich manuell auf der AWS-Maschine das Attribut "__bridged" auf den zweiten Parameter hinzufügen, kompiliert alles andere ordnungsgemäß.
- Ich habe den generierten Code mit clang -E verglichen und die resultierende Datei ist genau das gleiche.
Haben Sie eine Idee, was getan werden kann, um dieses Problem zu lösen? Ich kann das __bridged-Attribut nicht zu den Dateien hinzufügen, da OSX sie nicht benötigt und ich dieselben Kompilierergebnisse erhalten muss.
kann ich weitere Informationen zur Verfügung stellen, wenn nötig, habe ich schon die Ideen lief :(
Wenn das Kompilieren für macOS für diese Umwandlungen nicht '__bridge' erfordert, dann kompilieren Sie dort nicht für ARC. In diesem Fall kann der Code keine ordnungsgemäße Speicherverwaltung durchführen. Stellen Sie sicher, dass Sie ARC für beide Fälle verwenden. Auch wenn Sie ARC nicht verwenden, können Sie auch '__bridge' verwenden. Es wird nur in diesem Fall ignoriert. Außerdem können Sie 'CFSTR (" ... ")' für den vierten Arg anstelle eines von Ihnen gewirkten 'NSString' verwenden. –
Ich habe die macOS-Kompilierung überprüft und verwende das -fobjc-arc-Argument, also denke ich, dass ARC verwendet wird. Mein Hauptproblem ist, dass dieser Code von einem Drittanbieter stammt und ich ihn nicht modifizieren kann (es sei denn, ich packe jedes Mal) – slopee
Ich könnte den falschen Weg gehen, aber wie ich theoretisch gelesen habe, ist CFStringRef unter dem CF_IMPLICIT_BRIDGING_ENABLED buchstabieren, damit es sich nicht beschweren sollte, oder? – slopee