ฉันจะ xcodebuild ไลบรารีแบบคงที่โดยเปิดใช้งาน Bitcode ได้อย่างไร


89

Xcode 7 แนะนำBitcodeซึ่งเป็นไบนารีระดับกลาง LLVM ซึ่งหมายความว่าเซิร์ฟเวอร์ของ Apple สามารถคอมไพล์แอปของฉันใหม่สำหรับสถาปัตยกรรมที่แตกต่างกันโดยที่ฉันไม่ต้องมีส่วนร่วม

ที่ Lookback ฉันแจกจ่ายกรอบการเก็บถาวรแบบคงที่กับไลบรารีของเรา ดูเหมือนว่าเมื่อคุณสร้างด้วยสิ่งใดก็ตามนอกจาก "Build & Archive" bitcode จะไม่ถูกปล่อยออกมาในห้องสมุดของฉันจริง ๆ และใครก็ตามที่เชื่อมโยงกับห้องสมุดของฉันในแอปของพวกเขาและพยายามเปิดใช้งาน 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 สร้างขึ้นด้วย Xcode 7 ด้วย xcodebuild ปกติ)

ฉันมีบิลด์สคริปต์ที่สร้างไบนารีสากลของอุปกรณ์ + โปรแกรมจำลองดังนั้นฉันจึงไม่สามารถใช้ Build & Archive ได้ แต่ฉันเรียกใช้xcodebuildจาก commandline จากสคริปต์ของฉัน ฉันจะxcodebuildสร้างไลบรารีที่เปิดใช้งาน bitcode ที่เหมาะสมได้อย่างไร


สวัสดี @nevyn ฉันพยายามที่จะให้ SDK ของคุณรวบรวมในแอปที่ใช้ bitcode มีวิธีไหม?
Stoff81

@ Stoff81 ขออภัยฉันกำลังดำเนินการอยู่ ฉันต้องการให้การอ้างอิงทั้งหมดของฉันทำงานกับ Bitcode ก่อนและมันก็ค่อนข้างทำงาน
nevyn

คำตอบ:


137

Bitcode เป็นคุณลักษณะเวลาคอมไพล์ (ไม่ใช่คุณลักษณะเวลาลิงก์) ซึ่งหมายความว่าไฟล์. o ทุกไฟล์ควรมีส่วนพิเศษที่เรียกว่า __bitcode เมื่อสร้างด้วย bitcode คุณสามารถยืนยันได้ว่าไบนารีของคุณเข้ากันได้กับ bitcode หรือไม่โดยการเรียกใช้otool -l (my .o or .a file) | grep __LLVMได้โดยการเรียกใช้

เมื่อคุณสร้างตามปกติ Xcode จะเพิ่มแฟล็กการสร้าง -fembed-bitcode-markerล็กให้กับการเรียกร้องเสียงดัง สิ่งนี้ดูเหมือนจะเป็น 'นี่คือที่ที่ bitcode จะไปถ้าเปิดใช้งาน bitcode' และไม่ได้เปิดใช้งาน bitcode จริง

เมื่อคุณ "สร้างและเก็บถาวร" แฟ-fembed-bitcodeล็กนี้จะถูกแทนที่ด้วยซึ่งจะสร้างไบนารีที่เปิดใช้งาน Bitcode

ดูเหมือนจะมีสองวิธีในการxcodebuildใช้ประโยชน์-fembed-bitcode:

  • ใช้การกระทำ 'เก็บ' ในขณะที่แทนxcodebuild -target LookbackSDK archive xcodebuild -target LookbackSDK buildสิ่งนี้มีผลข้างเคียงของการใส่ไบนารีใน Xcode Organizer ของคุณแทนที่จะเป็นbuild/โฟลเดอร์แม้ว่าคุณจะสามารถแก้ไขได้โดยใช้-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

exportFormat ใดใช้สำหรับ xcodebuild ของเฟรมเวิร์ก ดูเหมือนจะกำหนดเฉพาะ "ipa", "pkg" และ "app" เท่านั้น ( developer.apple.com/library/mac/documentation/Darwin/Reference/… )
Fabian Köbel

@nevyn ยังไม่สามารถสร้างแอปหลักของฉันซึ่งมีไฟล์เฟรมเวิร์กที่กำหนดเองซึ่งจะมีสคริปต์การสร้างที่มีแฟล็กดังกล่าวข้างต้น
ravoorinandan

otool -l (ไฟล์. o หรือ. a ของฉัน) คุณหมายถึง otool -l (my .o or .a file) | grep __bitcode?
Mike M

1
@ MikeM ไม่จริงotool -l myfile.o | grep __LLVMเพราะจะมีส่วน __bitcode แม้ว่าจะมีเพียงเครื่องหมาย bitcode อยู่ในนั้นแทนที่จะเป็น bitcode จริง
nevyn

41

ด้วย 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

นอกจากนี้ยังแก้ไขปัญหาของฉันในขณะที่คำตอบเริ่มต้นไม่ได้อีกต่อไป
Kamchatka

ประหยัดชีวิต! ขอขอบคุณ!
vidalbenjoe

17

เมื่อคุณเพิ่มการรองรับ bitcode สำหรับ lib แบบคงที่แล้วมันจะเข้ากันไม่ได้กับ Xcode 6 แอปจะไม่เก็บถาวร

ฉันอยากจะพูดถึงการตั้งค่า bitcode อย่างชัดเจนเนื่องจากคำตอบของ @nevyn ทำให้ฉันสับสนเล็กน้อย

ไปที่การตั้งค่าการสร้างค้นหา "แฟล็กคอมไพเลอร์ที่กำหนดเอง" -fembed-bitcodeเพิ่ม สิ่งนี้จะสร้าง lib ของคุณด้วย bitcode


6

เลือกโปรเจ็กต์ในการตั้งค่าบิลด์ -> แฟล็ก C อื่นตั้งค่า Debug เป็น -fembed-bitcode-marker และ Release to -fembed-bitcode

ในการตั้งค่าการสร้างคลิกที่เครื่องหมาย + ที่ด้านบนเพื่อเพิ่มการตั้งค่าการสร้างที่ผู้ใช้กำหนดโดยใช้ชื่อ BITCODE_GENERATION_MODE และตั้งค่า Debug เป็นเครื่องหมายปล่อยเป็น bitcode

แก้ไขสคีมาเป็นรีลีสจากนั้นคลิกไลบรารีที่ต้องการ ไฟล์และรับเส้นทางการสร้าง รับไลบรารีโฟลเดอร์ Release

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.