更新到Xcode 9后Swift编译AVcode错误/ Swift 4
我有一个正常的UIViewController
,使用AVCapturePhoto
我创建了一个自定义捕获控制器。更新到Xcode 9后Swift编译AVcode错误/ Swift 4
一切工作正常,直到我更新到Xcode 9
并转换我的代码Swift 4
,现在当我尝试编译我得到这个编译错误:
Undefined symbols for architecture x86_64: "__T0So22AVCapturePhotoSettingsC12AVFoundation01_abC16SwiftNativeTypesACWP", referenced from: __T05Union16CameraControllerC18handleCapturePhotoyyF in CameraController.o "__T012AVFoundation39_AVCapturePhotoSettingsSwiftNativeTypesPAAE016availablePreviewc11PixelFormatG0Says6UInt32VGfg", referenced from: __T05Union16CameraControllerC18handleCapturePhotoyyF in CameraController.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
,并在错误托盘显示此消息:
Apple Mach-O Linker Error Group
任何提示可能会导致这种情况?
更新的信息
这里的错误日志的Xcode的9打印屏幕。希望它有助于编译错误解决方案。
编辑
只是进行一些测试 - 如果我评论类代码,编译错误消失。
以下class
实施中是否有什么错误,我在Swift 4
中丢失?
import UIKit
import AVFoundation
class CameraController: UIViewController, AVCapturePhotoCaptureDelegate, UIViewControllerTransitioningDelegate {
let dismissButton: UIButton = {
let button = UIButton(type: .system)
button.setImage(#imageLiteral(resourceName: "right_arrow_shadow").withRenderingMode(.alwaysOriginal), for: .normal)
button.addTarget(self, action: #selector(handleDismiss), for: .touchUpInside)
return button
}()
let capturePhotoButton: UIButton = {
let button = UIButton(type: .system)
button.setImage(#imageLiteral(resourceName: "capture_photo").withRenderingMode(.alwaysOriginal), for: .normal)
button.addTarget(self, action: #selector(handleCapturePhoto), for: .touchUpInside)
return button
}()
let output = AVCapturePhotoOutput()
override func viewDidLoad() {
super.viewDidLoad()
transitioningDelegate = self
setupCaptureSession()
setupHUD()
}
// hiddes the status bar
override var prefersStatusBarHidden: Bool { return true }
//MARK: General funcs
fileprivate func setupCaptureSession() {
let captureSession = AVCaptureSession()
//1. setup inputs - camera
let captureDevice = AVCaptureDevice.default(for: AVMediaType.video)
do {
let input = try AVCaptureDeviceInput(device: captureDevice!)
if captureSession.canAddInput(input) {
captureSession.addInput(input)
}
} catch let err {
print("Could not setup camera input:", err)
}
//2. setup outputs
if captureSession.canAddOutput(output) {
captureSession.addOutput(output)
}
//3.setup output preview
let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewLayer.frame = view.frame
view.layer.addSublayer(previewLayer)
// starts the inputs/outputs
captureSession.startRunning()
}
fileprivate func setupHUD() {
// botão de captura
view.addSubview(capturePhotoButton)
capturePhotoButton.anchor(top: nil, left: nil, bottom: view.bottomAnchor, right: nil, paddingTop: 0, paddinfLeft: 0, paddingBottom: 24, paddingRight: 0, width: 80, height: 80)
capturePhotoButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
// dismiss button
view.addSubview(dismissButton)
dismissButton.anchor(top: view.topAnchor, left: nil, bottom: nil, right: view.rightAnchor, paddingTop: 12, paddinfLeft: 0, paddingBottom: 0, paddingRight: 12, width: 50, height: 50)
}
@objc func handleCapturePhoto() {
// processes the captured photo
let settings = AVCapturePhotoSettings()
guard let preview = settings.availablePreviewPhotoPixelFormatTypes.first else { return }
settings.previewPhotoFormat = [kCVPixelBufferPixelFormatTypeKey as String: preview]
output.capturePhoto(with: settings, delegate: self)
}
@objc func handleDismiss() {
dismiss(animated: true, completion: nil)
}
// Camera delegate
func photoOutput(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhoto photoSampleBuffer: CMSampleBuffer?, previewPhoto previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) {
// access the captured image
let imageData = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: photoSampleBuffer!, previewPhotoSampleBuffer: previewPhotoSampleBuffer!)
let previewImage = UIImage(data: imageData!)
// shows the image
let containerView = PreviewPhotoContainerView()
containerView.previewImageView.image = previewImage
view.addSubview(containerView)
containerView.anchor(top: view.topAnchor, left: view.leftAnchor, bottom: view.bottomAnchor, right: view.rightAnchor, paddingTop: 0, paddinfLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0)
}
}
所以我设法解决了这个问题。
不知何故,在Xcode 9中,您不能实现“免费”代码,这些代码在iOS模拟器上无法使用。
错误 - 解决后 - 非常简单。
我不能在模拟器中使用相机,因为它不起作用。
我认为Xcode可以提供更多有用的错误信息。
为了解决这个问题,在我的CameraController class
我不得不编辑我的handleCapturePhoto()
函数。
我必须检查,如果使用的架构不是x86_64
(模拟器),那么我可以呈现相机输出。
这是函数解决状态:
@objc func handleCapturePhoto() {
// processes the captured photo
let settings = AVCapturePhotoSettings()
// doesn't show in the simulator
#if (!arch(x86_64))
guard let preview = settings.previewPhotoFormat?.first else { return }
settings.previewPhotoFormat = [kCVPixelBufferPixelFormatTypeKey as String: preview]
output.capturePhoto(with: settings, delegate: self)
#endif
}
希望这可以帮助别人的未来。
这会让您构建并运行您的项目,但不是解决问题的真正解决方案。我试过这个,并且替换了我找到的其他解决方案,而没有使用'#if(!arch(x86_64))',而且它的行为并不像预期的那样。但是,如果它适合你,它适用于你。请注意,此解决方案可能会解决该问题,但会替换为新问题 –
这非常简单。如果设备是模拟器 - 请勿打开相机。这只是为了测试,在发布版本中,我可以删除#ifdef反正如果我想 –
正如我所提到的,我在我的iPhone 7上试过这个解决方案,并且它删除了编译错误,但它的行为方式与预期。所以,请确保您的所有功能都按预期工作。如果是这样,你很好。 –
你未定义的符号demangles成'为__ObjC.AVCapturePhotoSettings协议见证表:在AVFoundation' –
AVFoundation._AVCapturePhotoSettingsSwiftNativeTypes @KevinBallard抱歉,但我有点失去了您的评论。 你是说我需要符合AVCapturePhotoSettings协议? –
我很困惑,为什么这是另一个问题的重复。在我的iphone7上测试时出现此错误。把这个标记为重复的人喝醉了!我发现了几种修复我的问题的方法,而不使用该代码,#if arch(x86_64) –