Objective-C指针类型的奇怪演员' NSString *'到C指针类型' CFStringRef'错误

时间:2017-04-04 15:22:35

标签: objective-c clang automatic-ref-counting cross-compiling llvm-clang

我已经看到有一些主题与" Cast of Objective-C指针类型' NSString *'到C指针类型' CFStringRef'"问题解决了,但我的情况略有不同。

我正在从linux进行一些iOS交叉编译,我有一个带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机器上手动添加" __桥接"第二个参数的属性一切正常编译。
      - 我将生成的代码与clang -E进行了比较,结果文件完全相同。

你们有什么想法可以解决这个问题吗?我无法将__bridged属性添加到文件中,因为OSX不需要它们,我需要获得相同的编译结果。

如果需要,我可以提供更多细节,我已经没有想法了:(

1 个答案:

答案 0 :(得分:0)

我终于找到了问题的根本原因。在我的主机上,我没有使用CCache,但是在AWS机器上使用它。

AWS计算机有一个旧的CCache版本,其中run_second_cpp选项设置为false,编译分为两个步骤:首先运行预处理程序(使用-E),检查命中,如果它不是'找到,用前面的预处理器输出编译代码。将其更改为" True"手动配置一切都开始工作。

此处解释了此行为的主要原因:Missing bridge cast causes error in preprocessed source but not in real source

感谢Ken提出的问题和帮助,他们让我思考了一下,并四处寻找更多差异!真的很感激!