我已经看到有一些主题与" 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不需要它们,我需要获得相同的编译结果。
如果需要,我可以提供更多细节,我已经没有想法了:(
答案 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提出的问题和帮助,他们让我思考了一下,并四处寻找更多差异!真的很感激!