Làm cách nào để xcodebuild một thư viện tĩnh với Bitcode được bật?


88

Xcode 7 giới thiệu Bitcode , là một số loại nhị phân trung gian LLVM có nghĩa là máy chủ của Apple có thể biên dịch lại ứng dụng của tôi cho các kiến ​​trúc khác nhau mà không cần sự tham gia của tôi.

Tại Lookback, tôi phân phối khung lưu trữ tĩnh với thư viện của chúng tôi. Có vẻ như khi bạn xây dựng bằng bất kỳ thứ gì ngoại trừ "Xây dựng & Lưu trữ", bitcode không thực sự được phát vào thư viện của tôi và bất kỳ ai liên kết với thư viện của tôi trong ứng dụng của họ và cố gắng thực hiện Xây dựng & Lưu trữ với Bitcode được bật sẽ nhận được một trong hai cảnh báo:

  • 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. (nếu lib được xây dựng bằng 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) (nếu lib được xây dựng bằng Xcode 7 với một xcodebuild bình thường)

Tôi có một tập lệnh xây dựng xây dựng một thiết bị + trình mô phỏng nhị phân phổ quát, vì vậy tôi không thể sử dụng Xây dựng & Lưu trữ, mà thay vào đó, tôi chạy xcodebuildtừ dòng lệnh từ tập lệnh của mình. Làm cách nào để xcodebuildtạo một thư viện hỗ trợ mã bit thích hợp?


HI @nevyn Tôi đang cố gắng để SDK của bạn biên dịch trong một ứng dụng sử dụng mã bit. Là có một cách?
Stoff81

@ Stoff81 Xin lỗi, tôi đang giải quyết. Trước tiên, tôi cần làm cho tất cả các phụ thuộc của mình hoạt động với Bitcode, và nó khá vất vả.
nevyn

Câu trả lời:


137

Bitcode là một tính năng thời gian biên dịch (không phải tính năng thời gian liên kết) có nghĩa là mọi tệp .o phải chứa một phần bổ sung được gọi là __bitcode khi được xây dựng bằng bitcode. Bạn có thể xác nhận xem tệp nhị phân của mình có tương thích với mã bit hay không bằng cách chạy otool -l (my .o or .a file) | grep __LLVM.

Khi bạn xây dựng bình thường, Xcode sẽ thêm cờ xây dựng -fembed-bitcode-markervào bất kỳ lệnh gọi nào. Điều này dường như là một số loại 'đây là nơi bitcode sẽ đến, nếu bitcode được kích hoạt' và không thực sự kích hoạt bitcode.

Khi bạn "Xây dựng & Lưu trữ", cờ này được thay thế bằng -fembed-bitcode, cờ này thực sự tạo ra một tệp nhị phân hỗ trợ Bitcode.

Có vẻ như có hai cách để xcodebuildsử dụng -fembed-bitcode:

  • Sử dụng hành động 'lưu trữ' xcodebuild -target LookbackSDK archivethay vì trong xcodebuild -target LookbackSDK build. Điều này có tác dụng phụ của việc đặt các tệp nhị phân trong Trình tổ chức Xcode của bạn thay vì build/thư mục, mặc dù bạn có thể giải quyết vấn đề đó bằng cách sử dụng -exportArchive -archivePath ./build(cảm ơn @JensAyton )
  • Buộc sử dụng cờ bằng cách thêm Cờ C khác với OTHER_CFLAGS="-fembed-bitcode". Lời xcodebuildkêu gọi của bạn sẽ trông như thế nào xcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build.

Cái sau là những gì tôi đã chọn để tôi không phải thay đổi hệ thống xây dựng của mình, nhưng nó sẽ tạo ra cảnh báo cho mọi tệp, vì bây giờ cả hai -fembed-bitcode-marker-fembed-bitcodeđều được gửi đến tiếng kêu. May mắn thay, phần sau chiến thắng, tạo ra một thư viện hỗ trợ Bitcode!

Tài nguyên


9
FWIW, bạn cũng có thể loại bỏ cảnh báo về việc -fembed-bitcode-markerbị bỏ qua bằng cách thêm -Qunused-arguments.
mstorsjo

exportFormat nào sử dụng cho xcodebuild của một khuôn khổ? Chỉ "ipa", "pkg" và "ứng dụng" dường như được xác định ( developer.apple.com/library/mac/documentation/Darwin/Reference/… ).
Fabian Köbel

@nevyn Vẫn không thể xây dựng ứng dụng chính của tôi có tệp khung tùy chỉnh chứa tập lệnh xây dựng có cờ được đề cập ở trên.
ravoorinandan

otool -l (tệp .o hoặc .a của tôi). Ý bạn là otool -l (tệp .o hoặc .a của tôi) | grep __bitcode?
Mike M

1
@MikeM không thực sự otool -l myfile.o | grep __LLVM, bởi vì sẽ có một đoạn __bitcode ngay cả khi chỉ có mã đánh dấu bitcode trong đó thay vì bitcode thực.
nevyn

40

Với Xcode 8, tôi không thể OTHER_CFLAGS="-fembed-bitcode"làm việc. Tôi đã tiếp tục gặp phải điều gì đó dọc theo dòng was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install buildkhi tôi cố gắng tạo một bản dựng Lưu trữ của một ứng dụng có chứa khuôn khổ tĩnh của tôi.

Điều tôi thực sự đang tìm kiếm là:

BITCODE_GENERATION_MODE=bitcode

Tôi thực sự đang sử dụng Run Script bên trong một mục tiêu tổng hợp, dòng xcodebuild đầy đủ trông như thế này (chỉ để tham khảo):

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=bitcodephương pháp này dường như cũng được ưa thích hơn, như được đề xuất trong câu trả lời này .
William Denniss

Điều này cũng đã khắc phục sự cố của tôi trong khi câu trả lời mặc định không còn nữa.
Kamchatka

Tiết kiệm cuộc sống! Cảm ơn bạn!
vidalbenjoe

17

Sau khi bạn thêm hỗ trợ bitcode cho lib tĩnh, nó sẽ không tương thích với Xcode 6. Ứng dụng sẽ không lưu trữ.

Tôi muốn đề cập rõ ràng cài đặt cho bitcode vì câu trả lời của @ nevyn làm tôi bối rối một chút.

Đi tới Cài đặt xây dựng, tìm kiếm "cờ trình biên dịch tùy chỉnh". Thêm -fembed-bitcode. Điều này sẽ xây dựng lib của bạn bằng bitcode.


6

Chọn dự án Trên Cài đặt bản dựng -> Cờ C khác, đặt Gỡ lỗi thành -fembed-bitcode-marker và Phát hành thành -fembed-bitcode

Trên Cài đặt bản dựng, nhấp vào dấu + ở trên cùng để thêm cài đặt bản dựng do người dùng xác định với tên BITCODE_GENERATION_MODE và đặt Gỡ lỗi thành điểm đánh dấu, Phát hành thành mã bit

Chỉnh sửa lược đồ dưới dạng Bản phát hành Sau đó nhấp vào thư viện mong muốn. Một tệp và lấy đường dẫn xây dựng. Lấy mẫu thư viện Thư mục phát hành.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.