"Objective-C 포인터 유형 'NSString *'에서 C 포인터 유형 'CFStringRef'로 캐스트"문제가 해결 된 몇 가지 주제가 있지만 제 경우는 약간 다릅니다.
나는 리눅스에서 iOS 크로스 컴파일을하고 있는데 우분투가있는 로컬 데스크탑 PC를 가지고있어 모든 코드를 문제없이 컴파일 할 수있다. 이것을 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- 프로토 타입 -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-pragma -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wno- 상수 변환 -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-unclared-selector -Wno-deprecated-implementations -fstrict-aliasing -Wprotocol -Wno-sign-conversion -Wno-infinite -recursion -Wmost -Wno-four-char-constants -Wno-unknown-pragma -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 -유형 -Wno-implicit-atomic-properties -Wno-arc-repeated-use-of-weak -Wno-missing-braces -W 괄호 -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wno-unused-variable -Wunused-value -Wno-empty-body-Wno-uninitialized -Wno-unknown-pragma -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-unclared-selector -Wno-deprecated-implementations -fstrict-aliasing -Wprotocol -Wno-sign-conversion -Wno-infinite-recursion -Wmost -Wno-four-char-constants -Wno-unknown-pragma -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.mo -c /home/ubuntu/source/ios/BFAppLinkNavigation.m
흥미로운 점은 다음과 같습니다
.-두 시스템 모두 LLVM / Clang 버전이 정확히 동일합니다. 3.9.1 ~ svn288847-1 ~ exp1-
두 시스템 모두 동일한 SDK (iPhoneOS10.2.sdk)를 사용하고 있습니다. AWS 머신은 두 번째 매개 변수의 "__bridged"속성을 다른 모든 항목이 제대로 컴파일합니다.
-생성 된 코드를 clang -E와 비교했는데 결과 파일이 정확히 동일합니다.
이 문제를 해결하기 위해 무엇을 할 수 있는지 알고 계십니까? OSX에서 파일을 요구하지 않고 동일한 컴파일 결과를 얻어야하기 때문에 __bridged 속성을 파일에 추가 할 수 없습니다.
필요한 경우 더 자세한 정보를 제공 할 수 있습니다. 이미 아이디어가 부족합니다.
마침내 문제의 근본 원인을 찾았습니다. 내 호스트 컴퓨터에서는 CCache를 사용하지 않았지만 AWS 컴퓨터에서는 사용 중이었습니다.
AWS 머신에는 run_second_cpp 옵션이 false로 설정되고 컴파일이 두 단계로 분할 된 이전 CCache 버전이 있습니다. 먼저 전처리기를 실행하고 (-E 사용) 적중을 확인하고 찾을 수없는 경우 컴파일합니다. 이전 전 처리기 출력이있는 코드. 구성에서 수동으로 "True"로 변경 한 후 모든 것이 작동하기 시작했습니다.
이 동작의 주된 이유는 여기에 설명되어 있습니다. 브리지 캐스트가 누락되면 전처리 된 소스에서 오류가 발생하지만 실제 소스에서는 발생하지 않습니다.
질문과 도움을 주신 Ken에게 감사드립니다. 그들은 저를 조금 더 생각하고 더 많은 차이점을 찾아 보도록 만들었습니다! 정말 감사합니다!
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다