Bitcode가 활성화 된 상태에서 정적 라이브러리를 xcodebuild하려면 어떻게해야합니까?


88

Xcode 7 은 일종의 LLVM 중간 바이너리 인 Bitcode를 도입 하여 Apple의 서버가 내 개입없이 다른 아키텍처에 대해 내 앱을 다시 컴파일 할 수 있음을 의미합니다.

Lookback에서는 라이브러리와 함께 정적 아카이브 프레임 워크를 배포합니다. "Build & Archive"이외의 것으로 빌드 할 때 비트 코드는 실제로 내 라이브러리로 내보내지지 않으며, 앱에서 내 라이브러리와 연결하고 Bitcode를 활성화 한 상태에서 빌드 및 아카이브를 시도하는 사람은 다음 중 하나를 받게됩니다. 두 가지 경고 :

  • ld: 'Lookback(Lookback.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. (lib가 Xcode 6으로 빌드 된 경우)
  • ld: warning: full bitcode bundle could not be generated because 'Lookback(Lookback.o)' was built only with bitcode marker. The library must be generated from Xcode archive build with bitcode enabled (Xcode setting ENABLE_BITCODE) (lib가 일반 xcodebuild와 함께 Xcode 7로 빌드 된 경우)

장치 + 시뮬레이터 범용 바이너리를 빌드하는 빌드 스크립트가 있으므로 빌드 및 보관을 사용할 수 없지만 xcodebuild스크립트의 명령 줄에서 실행 합니다. xcodebuild적절한 비트 코드 사용 라이브러리를 생성하려면 어떻게 해야합니까?


안녕하세요 @nevyn Im은 비트 코드를 사용하는 앱에서 SDK를 컴파일하려고합니다. 방법이 있습니까?
Stoff81

@ Stoff81 죄송합니다, 작업 중입니다. 먼저 모든 종속성을 Bitcode로 작업해야하는데 꽤 많은 작업이 필요합니다.
nevyn

답변:


137

비트 코드는 컴파일 타임 기능 (링크 타임 기능이 아님)입니다. 즉, 모든 .o 파일은 비트 코드로 빌드 될 때 __bitcode라는 추가 섹션을 포함해야합니다. 를 실행하여 바이너리가 비트 코드와 호환되는지 확인할 수 있습니다 otool -l (my .o or .a file) | grep __LLVM.

정상적으로 빌드 할 때 Xcode는 -fembed-bitcode-markerclang 호출에 빌드 플래그 를 추가합니다 . 이것은 일종의 '비트 코드가 활성화되면 비트 코드가가는 곳'과 같으며 실제로 비트 코드를 활성화하지 않습니다.

"Build & Archive"를 사용하면이 플래그가으로 대체되어 -fembed-bitcode실제로 Bitcode 사용 바이너리를 빌드합니다.

xcodebuild사용 하는 방법에는 두 가지가 있습니다 -fembed-bitcode.

  • xcodebuild -target LookbackSDK archive대신 에서와 같이 '보관'작업을 사용합니다 xcodebuild -target LookbackSDK build. 이것은 build/폴더 대신 Xcode Organizer에 바이너리를 넣는 부작용이 있지만 -exportArchive -archivePath ./build( @JensAyton에게 감사 드립니다 )
  • 다른 C 플래그를 추가하여 플래그를 강제로 사용합니다 OTHER_CFLAGS="-fembed-bitcode". 귀하의 xcodebuild호출과 같이 보일 것이다 xcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build.

후자는 내가 내 빌드 시스템을 변경하지 않도록 선택했지만 지금 모두 이후 모든 파일에 대한 경고가 생성됩니다 무엇 -fembed-bitcode-marker-fembed-bitcode연타로 전송됩니다. 운 좋게도 후자가 승리하여 Bitcode 사용 라이브러리를 생성합니다!

자원


9
FWIW -fembed-bitcode-marker를 추가하면 무시된다는 경고를 없앨 수도 -Qunused-arguments있습니다.
mstorsjo 2015 년

프레임 워크의 xcodebuild에 어떤 exportFormat을 사용합니까? "ipa", "pkg"및 "app"만 정의 된 것 같습니다 ( developer.apple.com/library/mac/documentation/Darwin/Reference/… ).
Fabian Köbel 2015

@nevyn 여전히 위에서 언급 한 플래그가있는 빌드 스크립트를 포함하는 사용자 지정 프레임 워크 파일이있는 기본 앱을 빌드 할 수 없습니다.
ravoorinandan

otool -l (내 .o 또는 .a 파일). otool -l (내 .o 또는 .a 파일)을 의미합니까? grep __bitcode?
Mike M

1
@MikeM no 실제로 otool -l myfile.o | grep __LLVM, 실제 비트 코드 대신 비트 코드 마커 만 있더라도 __bitcode 세그먼트가 있기 때문입니다.
nevyn

40

Xcode 8에서는 일을 할 수 없었습니다 OTHER_CFLAGS="-fembed-bitcode". was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build정적 프레임 워크를 포함하는 앱의 아카이브 빌드를 만들려고 할 때 계속해서 무언가를 실행했습니다 .

내가 정말로 찾고 있던 것은 이것이었습니다.

BITCODE_GENERATION_MODE=bitcode

실제로 집계 대상 내부에서 Run Script를 사용하고 있습니다. 전체 xcodebuild 줄은 다음과 같습니다 (참조 용).

xcodebuild BITCODE_GENERATION_MODE=bitcode OTHER_CFLAGS="-fembed-bitcode" -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build


2
+1, 이 답변BITCODE_GENERATION_MODE=bitcode 에서 제안한 것처럼 방법이 선호되는 것 같습니다 .
William Denniss 2017

이것은 또한 내 문제를 해결했지만 기본 답변은 더 이상 없습니다.
Kamchatka

생명의 은인! 감사합니다!
vidalbenjoe

17

정적 lib에 대한 비트 코드 지원을 추가하면 Xcode 6과 호환되지 않습니다. 앱이 보관되지 않습니다.

@nevyn의 대답이 나를 약간 혼란스럽게했기 때문에 비트 코드에 대한 설정을 명확하게 언급하고 싶습니다.

빌드 설정으로 이동하여 "사용자 지정 컴파일러 플래그"를 검색합니다. 추가 -fembed-bitcode. 이것은 비트 코드로 lib를 빌드합니다.


6

빌드 설정-> 기타 C 플래그에서 프로젝트를 선택하고 디버그를 -fembed-bitcode-marker로 설정하고 릴리스를 -fembed-bitcode로 설정하십시오.

빌드 설정에서 상단의 + 기호를 클릭하여 BITCODE_GENERATION_MODE라는 이름의 사용자 정의 빌드 설정을 추가하고 디버그를 마커로, 릴리스를 비트 코드로 설정합니다.

릴리스로 스키마 편집 그런 다음 원하는 라이브러리를 클릭하십시오. 파일 및 빌드 경로를 가져옵니다. 라이브러리 양식 릴리스 폴더를 가져옵니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.