Xcode 12, xây dựng cho Trình mô phỏng iOS, nhưng liên kết trong tệp đối tượng được xây dựng cho iOS, cho kiến ​​trúc arm64


219

Đang cố gắng xây dựng một dự án lớn (và đang làm việc trên Xcode 11!) Trong Xcode 12 (beta 5) để chuẩn bị cho iOS 14. Codebase trước đây là Obj-C, nhưng bây giờ chứa cả Obj-C và Swift và sử dụng các nhóm Obj-C và / hoặc Swift.

Tôi đã kéo bản beta mới của cocoapods với hỗ trợ Xcode 12 (hiện tại là 1.10.0.beta 2).

Cài đặt pod thành công. Khi tôi xây dựng, tôi gặp lỗi sau trên khung pod:

"xây dựng cho Trình mô phỏng iOS, nhưng liên kết trong tệp đối tượng được xây dựng cho iOS, cho kiến ​​trúc arm64"

Khi tôi chạy lipo -info trên framework, nó có: armv7s armv7 i386 x86_64 arm64.

Trước đây, dự án có Kiến trúc hợp lệ được đặt thành: armv7, armv7s và arm64.

Trong Xcode 12, cài đặt đó sẽ biến mất, theo tài liệu của Apple. Kiến trúc được đặt thành $ (ARCHS_STANDARD). Tôi không có gì thiết lập trong các kiến ​​trúc bị loại trừ.

Bất cứ ai có ý tưởng về những gì có thể xảy ra ở đây? Tôi đã không thể tái tạo điều này với một dự án đơn giản hơn.


1
Tôi nhận được điều tương tự ở bước liên kết của bất kỳ khuôn khổ bên thứ 3 nào đang được đưa vào dự án theo cách thủ công. Tôi tò mò nếu bạn tìm thấy một giải pháp.
SlashDevSlashGnoll

Bạn đã giải quyết được điều này trong thời gian ngắn chưa? (giữa tháng 9, vẫn là Xcode 12 beta 6)
epologee

2
Điều này làm việc cho tôi: stackoverflow.com/questions/24924809/…
Narendar Singh Saini

3
Tôi đang nhận được building for iOS Simulator, but linking in object file built for macOS, for architecture x86_64:( Làm thế nào để khắc phục nó?
Sazzad Hissain Khan.

Câu trả lời:


347

Về cơ bản, bạn phải loại trừ arm64kiến trúc giả lập cả khỏi dự án của bạn và dự án Pod,

  • Để làm điều đó, hãy điều hướng đến Cài đặt xây dựng của dự án của bạn và thêm Any iOS Simulator SDKgiá trị arm64bên trong Excluded Architecture.

    nhập mô tả hình ảnh ở đây

HOẶC LÀ

  • Nếu bạn đang sử dụng các XCConfigtệp tùy chỉnh , bạn có thể chỉ cần thêm dòng này để loại trừ kiến ​​trúc trình mô phỏng.
EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64

Sau đó

Bạn phải làm tương tự đối với dự án Pod cho đến khi tất cả các nhà cung cấp vỏ ca cao hoàn thành việc thêm phần sau vào Podspec của họ .

s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }

Bạn có thể thêm thủ công Excluded Architechurevào Cài đặt bản dựng của dự án Pod , nhưng nó sẽ bị ghi đè khi bạn sử dụng pod install.

Thay vào đó, bạn có thể thêm đoạn mã này vào Podfile. Nó sẽ viết Cài đặt xây dựng cần thiết mỗi khi bạn chạypod install

post_install do |installer|
  installer.pods_project.build_configurations.each do |config|
    config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
  end
end

26
ồ, anh bạn! đã cứu ngày và có thể cả đêm của tôi! Cảm ơn vì một câu trả lời chi tiết như vậy.
sandpat

3
Chi tiết bổ sung về CocoaPods ở đây rất hay. Lưu ý rằng nếu không có [sdk=iphonesimulator*]sau đó EXCLUDED_ARCHS, XCode sẽ không tìm thấy nhóm của bạn khi xây dựng cho một thiết bị thực tế vì không có nhóm nào được tạo cho arm64.
mwu

2
Đã làm cho tôi! Lưu ý rằng đã có một post_install do |installer|phần trong hầu hết các Podfiles do trình lật. Dán phần bên trong installer.pods_project.build_configurations.each do |config| config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64" endphía sau flipper_post_install(installer)dòng.
Ramon Vermeulen

2
Tôi đang nhận được building for iOS Simulator, but linking in object file built for macOS, for architecture x86_64. Làm thế nào để sửa chữa nó?
Sazzad Hissain Khan

2
Giải pháp này là tuyệt vời và tôi muốn nói thêm rằng nếu bạn đang xây dựng pod của riêng mình, hãy đặc biệt lưu ý đến 2 dòng mà tác giả đề xuất sau "... cho đến khi tất cả các nhà cung cấp vỏ ca cao hoàn tất việc thêm vào Podspec của họ" vì không có trong Podspec của khuôn khổ của riêng tôi đã gây ra lỗi in linting khi tôi cố gắng đẩy nó vào repo riêng tư của mình. Cảm ơn!
Danny

75

TL; DR;

Đặt "Chỉ xây dựng kiến ​​trúc hoạt động ( ONLY_ACTIVE_ARCH)" thành cho các thư viện / ứng dụng của bạn, ngay cả đối với chế độ phát hành .


Trong khi cố gắng xác định nguyên nhân gốc rễ của vấn đề, tôi đã nhận ra một số sự thật thú vị về Xcode 12.

  1. Xcode 12 thực sự là bước đệm cho Apple Silicon, điều đáng tiếc là vẫn chưa có. Nhưng với nền tảng đó, chúng tôi sẽ nhận được macOS dựa trên arm64, nơi các trình mô phỏng cũng sẽ chạy trên kiến ​​trúc arm64 không giống như kiến ​​trúc x86_64 dựa trên Intel hiện tại.

  2. Xcode thường phụ thuộc vào "Run Destination" để xây dựng các thư viện / ứng dụng của nó. Vì vậy, khi một trình mô phỏng được chọn làm "Đích chạy", nó sẽ xây dựng ứng dụng cho các kiến ​​trúc trình mô phỏng có sẵn và khi một thiết bị được chọn làm "Đích chạy", nó sẽ xây dựng cho kiến ​​trúc mà thiết bị đó hỗ trợ ( arm*).

  3. xcodebuild, trong hệ thống xây dựng Xcode 12+ được coi arm64là kiến ​​trúc hợp lệ cho trình mô phỏng. Vì vậy, khi một trình mô phỏng được chọn làm đích chạy, nó có khả năng cố gắng biên dịch / liên kết các libs / ứng dụng của bạn với các arm64trình mô phỏng dựa trên (chưa khả dụng). Vì vậy, nó sẽ gửi clang(++)một số cờ -target như arm64-apple-ios13.0-simulatorở định dạng <architecture> - <os> - <sdk> - <platform> và clang cố gắng xây dựng / liên kết chống lại trình mô phỏng dựa trên arm64 mà cuối cùng không thành công trên Mac dựa trên Intel.

  4. Nhưng hãy xcodebuildthử điều này chỉ cho các bản phát hành . Tại sao? Bởi vì, ONLY_ACTIVE_ARCHcài đặt bản dựng "Build Active Architecture Only ( )" thường được đặt thành "No" chỉ cho cấu hình "Release". Và điều đó có nghĩa là xcodebuildsẽ cố gắng tạo tất cả các biến thể kiến ​​trúc của libs / ứng dụng của bạn cho đích chạy đã chọn cho các bản phát hành. Và đối với đích chạy Simulator, nó sẽ bao gồm cả hai x86_64arm64bây giờ, arm64trong Xcode 12+ cũng là một kiến ​​trúc được hỗ trợ cho trình mô phỏng để hỗ trợ Apple Silicon.

Nói một cách đơn giản, Xcode sẽ không tạo được ứng dụng của bạn bất cứ khi nào nó thử dòng lệnh xcodebuild, (mặc định là phát hành bản dựng, hãy xem tab chung của cài đặt dự án của bạn) hoặc nếu không ở chế độ phát hành . Vì vậy, một giải pháp đơn giản cho vấn đề này là đặt "Chỉ xây dựng kiến ​​trúc hoạt động ( ONLY_ACTIVE_ARCH)" thành trong thư viện / ứng dụng của bạn, ngay cả đối với chế độ phát hành.

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Nếu các thư viện được bao gồm dưới dạng Pod và bạn có quyền truy cập, .podspecbạn có thể chỉ cần đặt:

spec.pod_target_xcconfig = {'ONLY_ACTIVE_ARCH' => 'CÓ'}

spec.user_target_xcconfig = {'ONLY_ACTIVE_ARCH' => 'YES'} # không được khuyến nghị

Cá nhân tôi không thích dòng thứ hai vì các nhóm không nên gây ô nhiễm cho dự án mục tiêu và nó có thể bị ghi đè trong cài đặt mục tiêu. Vì vậy, dự án người tiêu dùng phải có trách nhiệm ghi đè cài đặt bằng một số phương tiện. Tuy nhiên, điều này có thể cần thiết để in thành công các podspec.

Tuy nhiên, nếu bạn không có quyền truy cập vào .podspec, bạn luôn có thể cập nhật cài đặt trong quá trình cài đặt các nhóm:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings["ONLY_ACTIVE_ARCH"] = "YES"
    end
  end
end

Một điều tôi lo ngại về tác động của điều này khi chúng tôi thực sự lưu trữ các libs / ứng dụng. Trong quá trình lưu trữ, các ứng dụng thường lấy cấu hình "Bản phát hành" và vì điều này sẽ tạo một bản phát hành chỉ xem xét kiến ​​trúc đang hoạt động của đích chạy hiện tại, với cách tiếp cận này, chúng tôi có thể mất các lát cho armv7, armv7s, v.v. từ bản dựng đích. Tuy nhiên, tôi nhận thấy tài liệu cho biết (được đánh dấu trong hình đính kèm) rằng cài đặt này sẽ bị bỏ qua khi chúng tôi chọn "Thiết bị iOS chung / Thiết bị bất kỳ" làm đích chạy, vì nó không xác định bất kỳ kiến ​​trúc cụ thể nào. Vì vậy, tôi đoán chúng ta sẽ tốt nếu chúng ta lưu trữ ứng dụng của mình chọn đó làm điểm đến chạy.


20
Đây là câu trả lời đầu tiên cải thiện sự hiểu biết của tôi về vấn đề, thay vì chỉ nói "thay đổi ba cài đặt xây dựng này và có thể nó hoạt động". Cảm ơn bạn đã dành thời gian viết thư!
epologee

1
Đây thực sự là một thay đổi đáng ngạc nhiên từ Apple và tôi đã mất nửa ngày để tìm ra rằng tôi cảm thấy Apple nên bù đắp :). Đây không phải là một bản cập nhật được lập thành văn bản (ít nhất là như tôi biết) và chắc chắn sẽ ảnh hưởng đến mọi người nâng cấp lên Xcode 12. Tôi chỉ hy vọng mọi người tìm ra cách riêng để vượt qua nó khi họ biết những điều cơ bản.
Ayan Sengupta

1
Nếu có nhiều thông số kỹ thuật pod sử dụng user_target_xcconfigvà các giá trị không phù hợp chính xác, CocoaPods sẽ phát ra cảnh báo như thế này [!] Can't merge user_target_xcconfig for pod targets: [... list of pods ...]. Singular build setting EXCLUDED_ARCHS[sdk=<...>] has different values.Các tài liệu tham khảo cú pháp podspec nói thuộc tính này là "không được khuyến khích" guides.cocoapods.org/syntax/podspec.html#user_target_xcconfig . Vì vậy, xin vui lòng không sử dụng user_target_xcconfigcho điều này để tiết kiệm cho nhiều nhà phát triển những rắc rối.
leberwurstsaft

2
Đúng! Và tôi nghĩ rằng tôi đã đề cập đến điều đó trong câu trả lời của mình.
Ayan Sengupta

2
Cuối cùng, tôi đã cố gắng làm cho tất cả hoạt động với 'EXCLUDED_ARCHS [sdk = iphonesimulator *]' => 'arm64' nhưng chỉ trong pod_target_xcconfig và chỉ trên nhóm vấn đề (bao gồm một thư viện được tạo sẵn) và một nhóm phụ thuộc vào nhóm vấn đề. Mọi thứ khác đã được để sạch. Tôi quyết định tôi thích điều đó hơn cho giải pháp vòm hoạt động.
Airsource Ltd

65

Đã tìm thấy một giải pháp! https://developer.apple.com/forums/thread/657913

Nếu bạn đặt các kiến ​​trúc bị loại trừ cho trình mô phỏng thành arm64, nó sẽ biên dịch.

loại trừ kiến ​​trúc cho trình mô phỏng


5
Tôi không tin rằng đây là một giải pháp. Điều này tạo ra sự cố với bước xây dựng bài đăng của cocoapods với tập lệnh mà họ cài đặt. Pods / Target Support Files / Pods-All-Apps-XXX / Pods-All-Apps-XXX-frameworks.sh: line 141: ARCHS [@]: biến unbound Đây là một phương pháp đang cố gắng loại bỏ các kiến ​​trúc không hợp lệ, vì vậy nó vẫn không thể hoàn thành việc xây dựng. Ngay cả khi đó, loại trừ arm64 là một bản sửa lỗi tạm thời có thể khiến sim chạy nhưng sẽ không khắc phục được sự cố bản dựng.
btxios

Công bằng mà nói, vấn đề tôi gặp phải là với một thư viện được liên kết thủ công, tuy nhiên, nó không gây ra sự cố với các nhóm mà chúng tôi đang sử dụng.
SlashDevSlashGnoll

3
Tôi đang thử nghiệm ở chế độ Phát hành nên tôi cũng phải thêm nó vào Bản phát hành
MujtabaFR

Tôi nghĩ rằng chúng tôi đã trở lại kinh doanh sau bài đăng này. cảm ơn bạn nó đã giúp.
JBarros35

Điều này làm việc cho tôi! Cảm ơn bạn.
Arshad

42

Xcode 12, beta 6

Cài đặt xây dựng Kiến trúc hợp lệ đã bị xóa trong Xcode 12. Nếu bạn có các giá trị trong cài đặt xây dựng này, chúng đang gây ra sự cố và cần được xóa.

Tôi có thể "xóa" cài đặt bản dựng VALID_ARCHS bằng cách thêm lại nó dưới dạng cài đặt bản dựng Do người dùng xác định (không có giá trị), chạy dự án (không thành công) và sau đó xóa cài đặt bản dựng VALID_ARCHS. Sau đó, tôi đã có thể chạy trên trình mô phỏng.

Cài đặt xây dựng Kiến trúc của tôi là Kiến trúc tiêu chuẩn.

Bạn có thể thêm Cài đặt do người dùng xác định từ nút dấu cộng trong Cài đặt bản dựng:

Cài đặt do người dùng xác định


7
Đây phải là câu trả lời được chấp nhận. Đảm bảo rằng dự án ứng dụng được chọn không phải là Mục tiêu. Nếu không, bạn sẽ không thể xóa VALID_ARCHS khỏi Cài đặt bản dựng. :)
Bionicle

1
@trishcode Ngay cả sau khi thực hiện điều này, tôi vẫn gặp lỗi tương tự (xcode12 beta4), mọi cách giải quyết
Sivakrishna Perla

3
@SivakrishnaPerla Nếu bạn có thể mở dự án trong Xcode 11, thì bạn có thể xem chính xác các mục tiêu Kiến trúc hợp lệ được sử dụng. Bạn thậm chí có thể xóa cài đặt trong Xcode 11 và sau đó thử lại dự án trong Xcode 12. Nếu bạn vẫn cần một giải pháp thay thế và bạn đang gặp lỗi trên một khung được nhúng, thì câu trả lời của SlashDevSlashGnoll sẽ hoạt động. Nếu bạn cần một giải pháp thay thế và gặp lỗi trên Cocoapod, hãy loại trừ kiến ​​trúc arm64 trong cài đặt bài đăng Podfile.
trishcode

1
@trishcode Cảm ơn, Đặt arm64 trong kiến ​​trúc bị loại trừ và xóa VALID_ARCHS đã hoạt động.
Sivakrishna Perla

1
Nếu tôi xóa VALID_ARCHS và thêm arm64 vào kiến ​​trúc Bị loại trừ, tôi gặp lỗi này - Kiểm tra phần phụ thuộc Không có kiến ​​trúc nào để biên dịch cho (ARCHS = arm64 x86_64, VALID_ARCHS =, EXCLUDED_ARCHS = (arm64)).
nOOb iOS

9

Nếu bạn gặp sự cố trong Xcode 12 với trình mô phỏng, không phải thiết bị thực, có, bạn phải xóa cài đặt VALID_ARCHS vì nó không được hỗ trợ nữa. Đi tới "cài đặt bản dựng", tìm kiếm " VALID_ARCHS " và xóa các thuộc tính do người dùng xác định. Làm điều đó trong mọi mục tiêu bạn có.

Tuy nhiên, bạn có thể cần thêm một tập lệnh ở cuối tệp podfile của mình để các nhóm biên dịch với kiến ​​trúc và mục tiêu triển khai phù hợp:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
      config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'
     end
  end
end

Xóa VALID_ARCHSkhỏi dự án của tôi hoạt động tốt. Tôi không thay đổi gì đối với podfile cũng như dự án nhóm.
Ángel Téllez

7

Sau khi nâng cấp lên Xcode 12, tôi vẫn có thể xây dựng cho một thiết bị thực, nhưng không phải trình mô phỏng. Bản dựng Podfile chỉ hoạt động cho thiết bị thực.

Tôi đã xóa VALID_ARCHS trong Cài đặt bản dựng> Do người dùng xác định và nó đã hoạt động! Gội đầu một lúc trước khi tìm thấy điều này.


6

Tôi tin rằng tôi đã tìm thấy câu trả lời. Theo ghi chú phát hành Xcode 12 beta 6:

" Trình chỉnh sửa Cài đặt bản dựng không còn bao gồm cài đặt bản dựng Kiến trúc hợp lệ (VALID_ARCHS) và việc sử dụng nó không được khuyến khích. Thay vào đó, có một cài đặt bản dựng Kiến trúc bị loại trừ mới (EXCLUDED_ARCHS). Nếu một dự án bao gồm VALID_ARCHS, cài đặt này sẽ được hiển thị trong Người dùng -Phần xác định của trình soạn thảo Cài đặt bản dựng. (15145028) "

Tôi có thể giải quyết sự cố này bằng cách chỉnh sửa thủ công tệp dự án (tôi không thể tìm ra cách xóa mục khỏi tệp dự án bằng Xcode) và xóa tất cả các dòng tham chiếu đến VALID_ARCHS. Sau đó, tôi có thể xây dựng tốt cho trình mô phỏng.


1
Sử dụng Xcode, VALID_ARCHS trong chọn Dự án (không phải Mục tiêu), sau đó chọn Cài đặt Xây dựng -> Do Người dùng Xác định ". Chọn nó và xóa nó.
Akshay

Giải pháp này đã làm việc cho tôi. Giải pháp do một số người khác đề xuất đã không hoạt động vì chỉ cần thêm giá trị 'arm64' vào trường 'Kiến trúc loại trừ' bắt đầu gây ra một số lỗi 'Quyền tệp' cho tệp .app được tạo.
archeopetrix

5

Tôi giải quyết vấn đề bằng cách thêm "arm64" trong "Kiến trúc bị loại trừ" cho cả mục tiêu dự án và mục tiêu nhóm.

Xcode -> Dự án mục tiêu -> Cài đặt bản dựng -> Kiến trúc bị loại trừ> "arm64"

Xcode -> Pod Target -> Build Setting -> Kiến trúc bị loại trừ> "arm64"


5

Trong bạn xxx.framework tệp podspec thêm theo cấu hình tránh gói pod chứa các vòm tương tự arm64

s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }

Nó đã làm việc! Tuy nhiên, điều này có nghĩa là Pod không thể được sử dụng trong các máy Mac dựa trên Silicon của Apple?
tomacco

Có được xác nhận @tomacco không?
Fernando Reynoso

1
@FernandoReynoso Tôi vừa nhận được Bộ chuyển đổi dành cho nhà phát triển, (ARM MacMini) sẽ kiểm tra và báo cáo sau ngày hôm nay
tomacco

@tomacco Bạn đã kiểm tra được chưa?
Houman

Nếu có nhiều thông số kỹ thuật pod sử dụng user_target_xcconfigvà các giá trị không phù hợp chính xác, CocoaPods sẽ phát ra cảnh báo như thế này [!] Can't merge user_target_xcconfig for pod targets: [... list of pods ...]. Singular build setting EXCLUDED_ARCHS[sdk=<...>] has different values.Các tài liệu tham khảo cú pháp podspec nói thuộc tính này là "không được khuyến khích" guides.cocoapods.org/syntax/podspec.html#user_target_xcconfig . Vì vậy, xin vui lòng không sử dụng user_target_xcconfigcho điều này để tiết kiệm cho nhiều nhà phát triển những rắc rối.
leberwurstsaft

5

Xcode 12

Việc xóa VALID_ARCHkhỏi cài đặt Xây dựng trong Nhóm do người dùng xác định phù hợp với tôi.

nhập mô tả hình ảnh ở đây


4

Đối với tôi, cài đặt sau đã hoạt động:

Cài đặt bản dựng >> Kiến trúc bị loại trừ

đã thêm "arm64" vào cả chế độ Phát hành và Gỡ lỗi cho tùy chọn "Bất kỳ SDK trình mô phỏng iOS nào".

nhập mô tả hình ảnh ở đây


3

Đối với nhà phát triển Pod Trong Podspec của bạn, hãy thêm:

s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }

Sau đó, trong dự án mẫu của bạn Cài đặt tệp dự án mẫu

Xem nó hoạt động trong dự án này


Nếu có nhiều thông số kỹ thuật pod sử dụng user_target_xcconfigvà các giá trị không phù hợp chính xác, CocoaPods sẽ phát ra cảnh báo như thế này [!] Can't merge user_target_xcconfig for pod targets: [... list of pods ...]. Singular build setting EXCLUDED_ARCHS[sdk=<...>] has different values.Các tài liệu tham khảo cú pháp podspec nói thuộc tính này là "không được khuyến khích" guides.cocoapods.org/syntax/podspec.html#user_target_xcconfig . Vì vậy, xin vui lòng không sử dụng user_target_xcconfigcho điều này để tiết kiệm cho nhiều nhà phát triển những rắc rối.
leberwurstsaft

3

Tôi đang gặp sự cố khi xây dựng khung từ dòng lệnh. Khuôn khổ của tôi phụ thuộc vào các khuôn khổ khác thiếu hỗ trợ cho trình mô phỏng dựa trên ARM. Tôi đã kết thúc loại trừ hỗ trợ cho trình mô phỏng dựa trên ARM cho đến khi tôi nâng cấp các phụ thuộc của mình.

Tôi cần EXCLUDED_ARCHS=arm64cờ khi xây dựng khuôn khổ cho trình mô phỏng từ CLI.

xcodebuild archive -project [project] -scheme [scheme] -destination "generic/platform=iOS Simulator" -archivePath "archives/[scheme]-iOS-Simulator" SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES EXCLUDED_ARCHS=arm64

1
Ở đây cũng vậy. "Vấn đề" chính trong kịch bản này thực sự là xây dựng cho một điểm đến chung thông qua -destination "generic/platform=iOS Simulator". Điều này dẫn đến việc xây dựng cho tất cả các kiến ​​trúc có sẵn, bao gồm arm64 kể từ Xcode 12.
Sascha

3

Sau khi thử hầu hết mọi bài đăng trên chủ đề này và đọc qua các diễn đàn dành cho nhà phát triển apple, tôi thấy chỉ có một giải pháp phù hợp với tôi.

Tôi đang xây dựng một khuôn khổ chung được sử dụng trong một ứng dụng nhanh. Tôi không thể xây dựng lên Trình mô phỏng mà không có lỗi kiến ​​trúc.

Trong dự án Khung của tôi, tôi có một nhiệm vụ Khung chung trong các giai đoạn xây dựng của mình, nếu đây là trường hợp của bạn

  • Thêm phần sau vào xcodebuildnhiệm vụ của bạn trong giai đoạn xây dựng: EXCLUDED_ARCHS="arm64"

Tiếp theo, bạn phải thay đổi dự án sau Build Settings:

  • Xóa VALID_ARCHScài đặt do người dùng xác định
  • Đặt ONLY_ACTIVE_ARCHthành YES***

*** Nếu bạn đang phát triển một khuôn khổ và cũng có một ứng dụng demo, cài đặt này phải được bật trong cả hai dự án.


2

Cập nhật: Tháng 10 năm 2020

Bạn chỉ có thể đặt arm64chỉ cho Debug > Simulator - iOS 14.O SDKtrong Kiến trúc bị loại trừ.

nhập mô tả hình ảnh ở đây


1

Vấn đề ở đây là các kiến ​​trúc Hợp lệ trong Xcode 11, mở dự án trong Xcode 11 và thay đổi giá trị kiến ​​trúc Hợp lệ thành $ (ARCHS_STANDARD) cho cả dự án, mục tiêu và Nhóm của bạn, mở lại dự án trong Xcode 12 và xây dựng


1

Đặt "Build Active Architecture Only"(ONLY_ACTIVE_ARCH)cài đặt xây dựng thành có, xcodeđang yêu cầu arm64 vì kiến ​​trúc Silicon MAC là arm64.

arm64 đã được thêm làm vòm giả lập trong Xcode12 để hỗ trợ Silicon MAC.

/Application/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/SDKSettings.json


Nếu nó không chạy trên silicon Mac thì chắc chắn nó không nên sử dụng arm64?
Jonathan.

@Jonathan. Đúng, lẽ ra nó phải được làm như vậy, nhưng hiện tại thì không.
Aravind

1

Trong trường hợp của tôi: Xcode 12

Tôi bật các giá trị trống EXCLUDED_ARCHSvà đặt ONLY_ACTIVE_ARCHDebug = YESRelease = NO Cài đặt bản dựng của dự án

và tôi đã đưa cái này vào Podfile của mình:

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
        end
    end
end

Nó chạy trên Trình mô phỏng iPhone 8 (iOS 12) và iPhone 11 Pro Max (iOS 14) và trên thiết bị iPhone 7 Plus (iOS 13.4) của tôi


1

Trên Build Settingstìm kiếm VALID_ARCHrồi nhấn delete. Điều này sẽ hoạt động với tôi với Xcode 12.0.1

VALID_ARCH về cài đặt bản dựng


1
Tôi không tìm thấy VALID_ARCH , đây là cái gì?
Houman

1

Chỉ thêm Any iOS Simulator SDK -> x86_64vào Project's Build Settings -> VALID_ARCHScông việc cho tôi.

Phiên bản Xcode: 12.1 (12A7403)

nhập mô tả hình ảnh ở đây

Nếu dự án của bạn bao gồm một số khuôn khổ không hỗ trợ x86_64.

  • Bạn có thể thêm các tên khung này ( xxx.framework) vào Target -> Build Settings -> Excluded Source File Names -> Debug -> Any iOS Simulator SDK.
  • Và sau đó sửa đổi Framework Search Pathsđể xóa các đường dẫn của các khuôn khổ này Debug -> Any iOS Simulator SDK.

Hai cài đặt này có thể tránh Xcode xây dựng và liên kết các khung này trên chế độ giả lập.

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


1

Tôi hiểu sự cố với arm64 và Xcode 12 và tôi đã có thể giải quyết các sự cố bản dựng bằng cách loại trừ kiến ​​trúc arm64 cho Trình mô phỏng iPhone hoặc bằng cách đặt ONLY_ACTIVE_ARCH cho lược đồ Phát hành. Tuy nhiên, tôi vẫn gặp vấn đề khi đẩy khuôn khổ của mình bằng cách sử dụng pod repo push.

Tôi phát hiện ra rằng cài đặt s.pod_target_xcconfig trong podspec của tôi không áp dụng cài đặt này cho các phần phụ thuộc được xác định trong cùng một podspec. Tôi có thể thấy nó trong dự án Ứng dụng giả mà Cocoapods đang tạo trong quá trình xác thực. Xác thực Cocoapods đang chạy lược đồ phát hành cho trình mô phỏng và điều này không thành công khi một hoặc nhiều phần phụ thuộc không loại trừ arm64 hoặc không được đặt để chỉ xây dựng kiến ​​trúc hoạt động.

Một giải pháp có thể là buộc Cocoapods thêm tập lệnh đăng cài đặt trong khi xác thực dự án hoặc để nó xây dựng lược đồ Gỡ lỗi, vì lược đồ Gỡ lỗi chỉ đang xây dựng kiến ​​trúc hoạt động.

Tôi đã sử dụng Xcode 11 để giải phóng nhóm của mình nhằm vượt qua quá trình xác thực. Bạn có thể tải xuống Xcode 11 từ developer.apple.com, sao chép nó vào thư mục Ứng dụng dưới dạng Xcode11.app và chuyển sử dụng sudo xcode-select --switch /Applications/Xcode11.app/Contents/Developer. Đừng quên chuyển lại khi hoàn tất.


1

Tôi cũng gặp phải vấn đề tương tự với thư viện cụ thể đã được cài đặt thông qua carthage. Đối với những người đang sử dụng Carthage, vì Carthage không hoạt động tốt với Xcode 12, nên tài liệu này sẽ hướng dẫn cách giải quyết phù hợp với hầu hết các trường hợp. Vâng, trong thời gian ngắn, Carthage xây dựng các khung công tác béo, có nghĩa là khung công tác chứa các tệp nhị phân cho tất cả các kiến ​​trúc được hỗ trợ. Cho đến khi Apple Sillicon được giới thiệu, tất cả đều hoạt động tốt, nhưng bây giờ có một xung đột vì có kiến ​​trúc trùng lặp (arm64 cho thiết bị và arm64 cho trình mô phỏng). Điều này có nghĩa là Carthage không thể liên kết các khung cụ thể của kiến ​​trúc với một khung béo duy nhất.

Bạn có thể làm theo hướng dẫn tại đây. Carthage XCODE 12

Sau đó, sau khi bạn cấu hình Carthage. Đặt arm64 trong "Kiến trúc bị loại trừ" trên cài đặt xây dựng. nhập mô tả hình ảnh ở đây

Cố gắng chạy dự án của bạn bằng trình mô phỏng. Trình mô phỏng sẽ chạy mà không có bất kỳ lỗi nào.


0

Trong trường hợp của tôi:

Tôi đã có 4 cấu hình (+ DebugQa và ReleaseQa) Cocoapods được sử dụng làm Trình quản lý phụ thuộc

Đối với Gỡ lỗi, tôi tập hợp trên thiết bị và trong trình mô phỏng và chỉ trên qa trên thiết bị.

Nó đã giúp đặt BuildActiveArchitecture thành có trong PodsProject


0

Trong trường hợp của tôi, tôi đang cố gắng chạy trên trình mô phỏng watchOS 7 ở chế độ Relese nhưng trình mô phỏng iOS 14 đang ở chế độ Gỡ lỗi.

Vì vậy, chỉ cần đặt cả hai sim ở chế độ Gỡ lỗi / Phát hành đã giải quyết được vấn đề cho tôi!


0

Chuyển Cấu hình xây dựng trở lại chế độ Gỡ lỗi hoặc bật Chỉ xây dựng kiến ​​trúc hoạt động cho cả chế độ Gỡ lỗi và Phát hành. Lý do là thư viện / khuôn khổ của bạn không hỗ trợ kiến ​​trúc Trình mô phỏng mới ARM64 (chạy trên máy Mac với bộ xử lý Apple Silicon)


0

Thêm dòng "arm64" (không có dấu ngoặc kép) vào đường dẫn: Xcode -> Dự án -> Cài đặt xây dựng -> Kiến trúc -> Kiến trúc bị loại trừ Ngoài ra, làm tương tự với Pods. Trong cả hai trường hợp cho cả trường gỡ lỗi và phát hành.

hoặc chi tiết ...

Các lỗi được đề cập ở đây khi triển khai trình mô phỏng bằng Xcode 12 cũng là một trong những điều đã ảnh hưởng đến tôi. Chỉ cần nhấp chuột phải vào từng dự án của tôi và hiển thị trong công cụ tìm, mở .xcodeproj trong Atom, sau đó chuyển qua .pbxproj và xóa tất cả cài đặt VALIDARCHS. Đây là những gì nó làm việc cho tôi. Đã thử một số đề xuất khác (không bao gồm arm64, Build Active Architecture Only), điều này dường như giúp xây dựng của tôi tiến xa hơn nhưng cuối cùng lại để lại cho tôi một lỗi khác. Có cài đặt VALIDARCH nằm xung quanh có lẽ là điều tốt nhất bạn nên kiểm tra trước.


0

Chia sẻ giải pháp phù hợp với tôi, có thể giúp ích cho ai đó

Sự cố khi biên dịch cho trình mô phỏng:

xây dựng cho Trình mô phỏng iOS, nhưng liên kết trong tệp đối tượng được xây dựng cho iOS, cho kiến ​​trúc arm64

XCODE 12.1, POD 1.9.1

Cấu trúc dự án của tôi

  • Mục tiêu chính
  • Chia sẻ tiện ích mở rộng
  • Phần mở rộng dịch vụ thông báo
  • Mô-đun con, Khung tùy chỉnh
  • Podfile
  1. Thêm arm64vào cài đặt Xây dựng -> Exclude Architecturetrong tất cả các mục tiêu.

nhập mô tả hình ảnh ở đây

  1. Loại bỏ arm64từ VALID_ARCHSvà thêm vào x86_64trong tất cả các mục tiêu.

nhập mô tả hình ảnh ở đây

  1. Thêm mã sau vào podfile

    post_install do |installer|
        installer.pods_project.build_configurations.each do |config|
        config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
     end
    end
    
  2. Đã làm pod update, đã xóa podfile.lockvà đã làmpod install

  3. Làm sạch sẽ.


0

Sau khi thử rất nhiều câu trả lời vô ích trên mạng. Điều này làm việc cho tôi.

Đầu tiên, tạo x86_64 cho các dự án Pod !!!!

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['ARCHS'] = "arm64 x86_64"
        end
    end
end

Thứ hai, thêm "x86_64" cho VALID_ARCHS

nhập mô tả hình ảnh ở đây


0

Nó làm việc cho tôi khi tôi đặt $(ARCHS_STANDARD)cho VALID_ARCHScho gỡ lỗi cho bất kỳ iOS Simulator SDK. Ngoài ra tôi đã thiết lập YEScho ONLY_ACTIVE_ARCHcho Debug.

nhập mô tả hình ảnh ở đây


-2

Để làm cho điều này hoạt động cho các thử nghiệm tự động của Calabash

Có một yêu cầu kéo lên để khắc phục sự cố xcode 12 không hoạt động với calabash https://github.com/calabash/run_loop/pull/757

Một giải pháp tạm thời là sử dụng nhánh WIP này, mặc dù không phải là tuyệt vời nếu phải sử dụng nó vì nó là một PR nháp. Hy vọng sẽ có hỗ trợ Xcode 12 cho Calabash trong tương lai.

Thay đổi trong Gemfile của bạn

gem "run_loop"

đến

gem 'run_loop', git: 'https://github.com/calabash/run_loop.git', branch: 'xcode_14_support'
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.