Objective-C 포인터 유형 'NSString *'에서 C 포인터 유형 'CFStringRef'오류로의 이상한 캐스트

슬로프

"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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

상수 변수에 대한 C ++ 유형 캐스팅 포인터

분류에서Dev

C의 구조체 유형에 대한 포인터 캐스팅 이해

분류에서Dev

매개 변수를 사용하여 포인터를 반환하는 C ++-고유 한 포인터 유형 간의 비교에 캐스트가 없음

분류에서Dev

C의 "포인터 예상"및 "인수 유형 충돌"오류

분류에서Dev

비 Objective-C 포인터 유형 'const UInt8 *'(일명 'const unsigned char *')을 'NSData *'로 캐스트하는 것은 ARC에서 허용되지 않습니다.

분류에서Dev

C ++ 및 C #에서 'this'포인터의 개념 및 데이터 유형

분류에서Dev

구조체에 대한 포인터를 첫 번째 멤버로 캐스트하려면 어떤 유형의 C ++ 캐스트를 사용해야합니까?

분류에서Dev

오류 : 불완전한 유형에 대한 포인터 역 참조-C 언어

분류에서Dev

열거 형 유형의 속성이 포함 된 C # 인터페이스

분류에서Dev

c에서 포인터를 이중 포인터로 캐스팅하는 이유는 무엇입니까?

분류에서Dev

포인터의 C ++ 추출 유형

분류에서Dev

배열에 대한 C ++ 포인터 오류 : 단항 *의 유효하지 않은 유형 인수 ( 'int 포함), 할당의 왼쪽 피연산자로 lvalue 필요

분류에서Dev

C ++-17 : 함수 포인터를 다른 인수 포인터 유형의 함수로 캐스팅

분류에서Dev

abcde가 유형이자 포인터 인 경우 C의 sizeof (abcde)

분류에서Dev

Objective-C와 동등한 인터페이스 유형?

분류에서Dev

C ++ : 인수 유형이 다른 함수에 대한 함수 포인터 벡터

분류에서Dev

불완전한 유형 C에 대한 역 참조 포인터

분류에서Dev

C의 불완전한 유형 큐에 대한 역 참조 포인터

분류에서Dev

다른 유형에 대한 포인터를 비교하는 C ++?

분류에서Dev

구조체 벡터를 정의하고 C에서 포인터로 전달-오류 : 호환되지 않는 포인터 유형에서 초기화

분류에서Dev

Fortran 파생 형식 내부의 C 함수에 대한 포인터 보유

분류에서Dev

C ++에서 한 클래스의 포인터를 다른 클래스의 포인터로 캐스팅 할 수있는 이유는 무엇입니까?

분류에서Dev

Objective-c 포인터 마술. 유형 보호

분류에서Dev

호환되지 않는 포인터 유형 오류에서 C 할당

분류에서Dev

c에서 포인터의 형변환

분류에서Dev

C에서 포인터로 형변환

분류에서Dev

C ++ 반환 유형에는 현재 클래스 유형의 포인터가 있습니다.

분류에서Dev

복잡한 데이터 유형을 C #에서 포트란 dll로 전달

분류에서Dev

C ++의 데이터 유형 캐스팅

Related 관련 기사

  1. 1

    상수 변수에 대한 C ++ 유형 캐스팅 포인터

  2. 2

    C의 구조체 유형에 대한 포인터 캐스팅 이해

  3. 3

    매개 변수를 사용하여 포인터를 반환하는 C ++-고유 한 포인터 유형 간의 비교에 캐스트가 없음

  4. 4

    C의 "포인터 예상"및 "인수 유형 충돌"오류

  5. 5

    비 Objective-C 포인터 유형 'const UInt8 *'(일명 'const unsigned char *')을 'NSData *'로 캐스트하는 것은 ARC에서 허용되지 않습니다.

  6. 6

    C ++ 및 C #에서 'this'포인터의 개념 및 데이터 유형

  7. 7

    구조체에 대한 포인터를 첫 번째 멤버로 캐스트하려면 어떤 유형의 C ++ 캐스트를 사용해야합니까?

  8. 8

    오류 : 불완전한 유형에 대한 포인터 역 참조-C 언어

  9. 9

    열거 형 유형의 속성이 포함 된 C # 인터페이스

  10. 10

    c에서 포인터를 이중 포인터로 캐스팅하는 이유는 무엇입니까?

  11. 11

    포인터의 C ++ 추출 유형

  12. 12

    배열에 대한 C ++ 포인터 오류 : 단항 *의 유효하지 않은 유형 인수 ( 'int 포함), 할당의 왼쪽 피연산자로 lvalue 필요

  13. 13

    C ++-17 : 함수 포인터를 다른 인수 포인터 유형의 함수로 캐스팅

  14. 14

    abcde가 유형이자 포인터 인 경우 C의 sizeof (abcde)

  15. 15

    Objective-C와 동등한 인터페이스 유형?

  16. 16

    C ++ : 인수 유형이 다른 함수에 대한 함수 포인터 벡터

  17. 17

    불완전한 유형 C에 대한 역 참조 포인터

  18. 18

    C의 불완전한 유형 큐에 대한 역 참조 포인터

  19. 19

    다른 유형에 대한 포인터를 비교하는 C ++?

  20. 20

    구조체 벡터를 정의하고 C에서 포인터로 전달-오류 : 호환되지 않는 포인터 유형에서 초기화

  21. 21

    Fortran 파생 형식 내부의 C 함수에 대한 포인터 보유

  22. 22

    C ++에서 한 클래스의 포인터를 다른 클래스의 포인터로 캐스팅 할 수있는 이유는 무엇입니까?

  23. 23

    Objective-c 포인터 마술. 유형 보호

  24. 24

    호환되지 않는 포인터 유형 오류에서 C 할당

  25. 25

    c에서 포인터의 형변환

  26. 26

    C에서 포인터로 형변환

  27. 27

    C ++ 반환 유형에는 현재 클래스 유형의 포인터가 있습니다.

  28. 28

    복잡한 데이터 유형을 C #에서 포트란 dll로 전달

  29. 29

    C ++의 데이터 유형 캐스팅

뜨겁다태그

보관