-1

我已經看到有一些主題與「Cast of Objective-C指針類型'NSString *'到C指針類型' CFStringRef'「問題解決了,但是我的情況稍有不同。Objective-C指針類型'NSString *'奇怪的轉換爲C指針類型'CFStringRef'錯誤

我正在做一些iOS交叉編譯從Linux和我有一個本地臺式機與Ubuntu的地方,我可以管理編譯沒有任何問題,所有我的代碼。當我嘗試端口此爲AWS機器我得到以下編譯錯誤:

「Objective-C的指針類型的演員‘的NSString *’到C指針類型‘CFStringRef’」這個代碼:

 
- (NSString *)stringByEscapingQueryString:(NSString *)string { 
    return (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL, 
                       (CFStringRef)string, 
                       NULL, 
                       (CFStringRef) @":/?#[]@!$&'()*+,;=", 
                       kCFStringEncodingUTF8)); 
} 

使用下列編譯命令:

 
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 

什麼是關於這個有趣的是:
- 兩臺機器有完全相同LLVM/Clang的版本:3.9.1〜svn288847-1〜EXP1
- 兩臺機器都使用完全相同的SDK(iPhoneOS10.2.sdk) - 如果我在AWS機器上手動添加第二個參數的「__bridged」屬性,其他所有內容都可以正確編譯。
- 我將生成的代碼與clang -E進行了比較,結果文件完全相同。

你們有什麼想法可以解決這個問題嗎?我無法將__bridged屬性添加到文件,因爲OSX不需要它們,我需要獲得相同的編譯結果。

我可以提供更多的細節,如果需要的話,我已經跑出去的想法:(

+0

如果爲macOS編譯並不需要'__bridge'用於這些類型轉換,那麼您並不是在那裏編譯ARC。在這種情況下,代碼將無法執行正確的內存管理。確保你在兩種情況下都使用ARC。另外,即使你不使用ARC,你仍然可以使用'__bridge'。在這種情況下,它被忽略。另外,你可以使用'CFSTR(「...」)'作爲第四個參數,而不是你投的'NSString'。 –

+0

我已經檢查過macOS編譯,它使用了-fobjc-arc參數,所以我猜ARC正在被使用。我的主要問題是,這段代碼來自第三方,我無法修改它(除非我每次都應用補丁) – slopee

+0

我可能會對此做出錯誤的解決方法,但是從理論上講,CFStringRef位於CF_IMPLICIT_BRIDGING_ENABLED所以它不應該抱怨,對吧? – slopee

回答

0

我終於找到了問題的根源。在我的主機我沒有使用CCACHE但AWS機上它正在被使用

AWS機器有一箇舊的CCache版本,其中run_second_cpp選項設置爲false,並且編譯分爲兩步:首先運行預處理器(帶-E),檢查一個命中,並在大小寫如果沒有找到它,請使用先前的預處理器輸出編譯代碼。在配置中手動將其更改爲「True」後,所有內容都開始工作。

這種現象的主要原因是這裏解釋:Missing bridge cast causes error in preprocessed source but not in real source

感謝肯爲您的問題和幫助,他們讓我想到了一點,環顧四周更多的差異!真的很感激它!