Objective-C指针类型'NSString *'奇怪的转换为C指针类型'CFStringRef'错误

问题描述:

我已经看到有一些主题与“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

我终于找到了问题的根源。在我的主机我没有使用CCACHE但AWS机上它正在被使用

AWS机器有一个旧的CCache版本,其中run_second_cpp选项设置为false,并且编译分为两步:首先运行预处理器(带-E),检查一个命中,并在大小写如果没有找到它,请使用先前的预处理器输出编译代码。在配置中手动将其更改为“True”后,所有内容都开始工作。

这种现象的主要原因是这里解释:Missing bridge cast causes error in preprocessed source but not in real source

感谢肯为您的问题和帮助,他们让我想到了一点,环顾四周更多的差异!真的很感激它!