-1

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 :(

+0

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. –

+0

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

+0

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

Antwort

0

ich endlich die Ursache des Problems gefunden. In meiner Host-Maschine wurde ich mit CCache nicht aber auf der AWS-Maschine

Die AWS-Maschine hatte eine alte CCache-Version, in der die Option run_second_cpp auf false gesetzt war und die Kompilierung in zwei Schritte aufgeteilt wurde: Zuerst den Präprozessor (mit -E) starten, auf einen Treffer prüfen dass es nicht gefunden wurde, kompilieren Sie den Code mit der vorherigen Präprozessorausgabe.Nachdem Sie es in der Konfiguration manuell in "True" geändert haben, hat alles angefangen zu arbeiten.

Hauptgrund für dieses Verhalten wird hier erklärt: Missing bridge cast causes error in preprocessed source but not in real source

Dank Ken für Ihre Fragen und helfen, sie mir ein bisschen mehr denken ließ und für mehr Unterschiede schauen Sie sich um! Schätze es wirklich!