gpt4 book ai didi

swift - 如何在没有 Xcode 的情况下链接 CocoaPods 库(integrate_targets false)

转载 作者:行者123 更新时间:2023-11-28 05:45:10 27 4
gpt4 key购买 nike

我有一个没有使用 Xcode 构建的 swift 项目。我想使用 CocoaPods 中的一个库。给定以下 Podfile:

platform :osx, '10.11'
install! 'cocoapods', :integrate_targets => false
target 'Foo' do
pod "PlainPing"
end
pre_install do |installer|
installer.analysis_result.specifications.each do |s|
s.swift_version = '4.2' unless s.swift_version
end
end

我可以轻松地将库构建到 .a.swiftmodule 文件中:

pod install
cd Pods
xcodebuild

但是使用来自 swiftc 的编译库似乎很棘手,我无法猜测正确的搜索路径拼写或谷歌它们。我最好的选择:

swiftc -I ./build/Release/PlainPing -L ./build/Release/PlainPing -lPlainPing main.swift 

失败

main.swift:2:8: error: cannot load underlying module for 'PlainPing'

似乎 -L 库搜索路径有效,但 swiftc 缺少一些实际使用 .a 库文件的东西。

最佳答案

CocoaPod手动编译版本

要编译包含 Swift 和 Objective-C 代码的 CocoaPods 库,请执行以下操作:

  1. 将你的 main.swift 复制到 Pods/PlainPing/Pod/Classes
  2. 编译PlainPing Objective-C代码
  3. 发出 PlainPing.swiftmodule
  4. 编译PlainPing发射对象
  5. 编译应用包括发出的对象和main.swift

脚本(复制并粘贴到终端):

 echo "1. Compiling Objective-C code" && \
clang \
-c \
-fmodules \
-fobjc-weak \
-arch x86_64 \
-w \
SimplePing.m \
&& \
echo "2. Emitting PlainPing.swiftmodule" && \
swiftc \
-emit-module \
-module-name PlainPing \
-import-objc-header SimplePing.h \
PlainPing.swift SimplePingAdapter.swift \
&& \
echo "3. Compiling PlainPing" && \
swiftc \
-emit-object \
-module-name PlainPing \
-import-objc-header SimplePing.h \
PlainPing.swift SimplePingAdapter.swift \
&& \
echo "4. Compiling app" && \
swiftc \
-o app \
-I . \
-L . \
*.o main.swift \
&& \
echo "5. Running app" && \
./app

使用xcodebuild的版本

确保在 Podfile 的第二行添加 use_frameworks!

脚本(复制并粘贴到终端):

echo "Compiling Pods" && \
pod install && \
xcodebuild -project Pods/Pods.xcodeproj \
&& \
echo "Compiling App" && \
dir="build/Pods.build/Release/PlainPing.build/Objects-normal/x86_64" && \
swiftc \
-o app \
-L "$dir" \
-I "$dir" \
main.swift \
$(find $dir -name '*.o' -exec echo -n '{} ' \;) \
&& \
echo "Running App" && \
./app

示例 main.swift

import Foundation
import PlainPing

PlainPing.ping("www.apple.com", withTimeout: 1.0, completionBlock: { (timeElapsed:Double?, error:Error?) in
if let latency = timeElapsed {
print("latency (ms): \(latency)")
}

if let error = error {
print("error: \(error.localizedDescription)")
}
})

RunLoop.main.run()

关于swift - 如何在没有 Xcode 的情况下链接 CocoaPods 库(integrate_targets false),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55015633/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com