2016-01-19 14 views
11

Tôi đã xây dựng một khung công tác trong Swift. Khuôn khổ sử dụng Cocoapods, một trong các cụm được viết trong Objective C.Khung mỡ nhanh w/Mục tiêu-C Cocoapod

Tôi cũng sử dụng tập lệnh tùy chỉnh để làm cho khung làm khuôn khổ chất béo để hỗ trợ các hệ thống 32/64 bit. (Điều này chạy trong một mục tiêu riêng về dự án và tôi tự hỏi nếu có điều gì đó để làm gì với nó?)

UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal 

if [ "true" == ${ALREADYINVOKED:-false} ] 
then 
echo "RECURSION: Detected, stopping" 
else 
export ALREADYINVOKED="true" 

// Step 1. Build Device and Simulator versions 
xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build 
xcodebuild -target "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build 

//Step 2. Copy the framework structure (from iphoneos build) to the universal folder 
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/" 

// Step 3. Copy Swift modules (from iphonesimulator build) to the copied framework directory 
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/." "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule" 

// Step 4. Create universal binary file using lipo and place the combined executable in the copied framework directory 
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}" 

// Step 5. Convenience step to copy the framework to the project's directory 
cp -R "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}" 

// Step 6. Convenience step to open the project's directory in Finder 
open "${PROJECT_DIR}" 

fi 

Khi tôi tạo ra khuôn khổ mỡ này và đặt nó vào một dự án tôi muốn sử dụng nó trên trình biên dịch luôn thất bại b/c dự án không thể nhìn thấy mục tiêu C ca cao pod mô-đun.

clang: error: linker command failed with exit code 1 (use -v to see invocation) 
ld: framework not found Pusher for architecture x86_64 

Không tìm thấy kiến ​​trúc nào khi tôi thay đổi nền tảng xây dựng.

Bất kỳ giải pháp nào tôi có thể tạo một khung mà tôi có thể sử dụng trong một dự án Xcode riêng biệt (cho tất cả iOS hoặc OS X) sẽ thật tuyệt vời.

Trả lời

0

Dường như bạn đang thiếu kiến ​​trúc 64 bit cho Trình mô phỏng.

Khi bạn tạo mục tiêu từ Xcode, tùy thuộc vào loại trình giả lập bạn đã chọn - thư viện được tạo sẽ chứa i386 hoặc x86_64 tương ứng với phiên bản 32 bit hoặc 64 bit được chọn của trình mô phỏng.

Tôi đoán rằng trình tạo cli chỉ tạo phiên bản i386.

Bạn có thể cố gắng thiết lập các kiến ​​trúc trong kịch bản:

xcodebuild -target "${PROJECT_NAME}" ARCHS="i386 x86_64" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

Là một thay thế Bạn có thể cố gắng xây dựng bằng tay sử dụng 64bit mô phỏng (iPhone 5S +), sau đó trích xuất các kiến ​​trúc mất tích và sau đó đặt nó vào thư viện cuối cùng bằng lệnh lipo.

+0

Tôi tin rằng nó được quản lý bởi ONLY_ACTIVE_ARCH = NO args. Bên cạnh đó nó cũng hoạt động khi không có một cụm ca cao C-Objective. –

3

Bạn không thể chạy xcodebuild với -target khi sử dụng CocoaPods. Khi bạn sử dụng -target, Xcode sẽ chỉ xem xét dự án đang hoạt động và không kéo phụ thuộc vào Pod, tương tự như khi bạn vừa mở tệp dự án trong Xcode và thử xây dựng.

Bạn nên chạy xcodebuild -workspace "${PROJECT_NAME}.xcworkspace" -scheme "${PROJECT_NAME}" ..., giả sử rằng CocoaPods đã tạo không gian làm việc và Xcode đã tạo một lược đồ bằng cách sử dụng tên mục tiêu. Bạn cũng sẽ cần phải chắc chắn rằng lược đồ của bạn được đánh dấu là được chia sẻ nếu chạy chương trình này trên một thiết bị khác.

Khi khung công tác của bạn được xây dựng, bạn sẽ cần phải bao gồm nó và các khung phụ thuộc vào trong các ứng dụng sẽ sử dụng nó. Đối với khung công tác của bạn, điều đó có nghĩa là bao gồm nó trong General> Embedded Binaries và General> Linked Frameworks and Libraries. Đối với các khung mà bạn phụ thuộc vào, (ví dụ: AlamoFire), bạn có thể hướng dẫn người dùng đưa nó vào Podfile của họ, bạn có thể đóng gói và gửi nó cùng với khung của bạn hoặc bạn có thể làm cả hai và cho phép người dùng làm những gì phù hợp với họ.

+0

Có điều gì khác mà tôi cần phải làm hoặc thay đổi không? Tôi không nhận được một lỗi biên dịch về nó không tìm thấy một mô-đun nhưng khi tôi cố gắng chạy bất cứ điều gì tôi nhận được: ~/Library/Developer/CoreSimulator/Devices/74636985-3538-4693-B131-983106003055/data/Containers/Bundle/Ứng dụng/FBC92D11-240D-45BB-9F21-C4372DE509B4/TestMyKit.app/TestMyKit Lý do: không tìm thấy hình ảnh (lldb) –

+0

Đó có phải là lỗi đầy đủ không?Không có thông tin về những gì hình ảnh nó không thể tải? Là .framework được liệt kê trong cả hai thư viện để liên kết và nhị phân để nhúng cho ứng dụng đó? –

+0

Đây là lỗi đầy đủ: dyld: Thư viện không được tải: @ rpath/Alamofire.framework/Alamofire Tham chiếu từ: ~/Library/Developer/CoreSimulator/Devices/74636985-3538-4693-B131-983106003055/data/Containers/Bundle /Application/FFC6E8DA-4877-4142-A97B-73A3B7712319/TestMyKit.app/Frameworks/DICAPIKit.framework/DICAPIKit Lý do: hình ảnh không được tìm thấy (lldb) - Có khung được liên kết và nhúng. –

Các vấn đề liên quan