Apple Mach-O Linker (ld) Error Group with Swift 3

2019-01-25 10:22发布

This was running fine till GM Xcode (and iOS 11). Now I get these errors:

Apple Mach-O Linker (ld) Error Group
  "__T0So20AVCapturePhotoOutputC12AVFoundation01_abC16SwiftNativeTypesACWP", referenced from:
xxxxxxxxxx

"__T012AVFoundation37_AVCapturePhotoOutputSwiftNativeTypesPAAE012availableRawc11PixelFormatG0SaySo8NSNumberCGfg", referenced from:
xxxxxxxxx

"  "__T0So22AVCapturePhotoSettingsC12AVFoundation01_abC16SwiftNativeTypesACWP", referenced from:
xxxxxxxxxx

ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Some of the lines it's pointing at are:

photoSettings = AVCapturePhotoSettings(rawPixelFormatType: OSType(self.photoOutput.availableRawPhotoPixelFormatTypes.first!))
photoSettings.previewPhotoFormat = [kCVPixelBufferPixelFormatTypeKey as String: photoSettings.availablePreviewPhotoPixelFormatTypes.first!.uint32Value,
                                                kCVPixelBufferWidthKey as String: 3024, kCVPixelBufferHeightKey as String: 3024]

Also:

let rawFormat = self.photoOutput.availableRawPhotoPixelFormatTypes.first!.uint32Value
photoSettings = AVCapturePhotoSettings(rawPixelFormatType: OSType(rawFormat),
                            processedFormat: [AVVideoCodecKey : AVVideoCodecJPEG,
                                              AVVideoCompressionPropertiesKey : [AVVideoQualityKey : 1.0]] as [String : Any])
            photoSettings.previewPhotoFormat = [kCVPixelBufferPixelFormatTypeKey as String: photoSettings.availablePreviewPhotoPixelFormatTypes.first!.uint32Value,
                                                kCVPixelBufferWidthKey as String: 3024,
                                                kCVPixelBufferHeightKey as String: 3024]

3条回答
女痞
2楼-- · 2019-01-25 10:32

I've changed:

if cameraOutput.supportedFlashModes.contains(NSNumber(value: flashMode.rawValue)) {

to:

if cameraOutput.__supportedFlashModes.contains(NSNumber(value: flashMode.rawValue)) {

and

let previewPixelType = settings.availablePreviewPhotoPixelFormatTypes.first!

to

let previewPixelType = settings.__availablePreviewPhotoPixelFormatTypes.first!

and the app started.

查看更多
我只想做你的唯一
3楼-- · 2019-01-25 10:52

Update 15 Sept 2017:

Official response from Apple:

Our apologies. For apps using Swift 3.2 or Swift 4.0, several AVFoundation capture APIs (public extensions on external protocol) were inadvertently marked private in Xcode 9. The following AVFoundation API are temporarily unavailable:

  • AVCaptureDevice.Format.supportedColorSpaces

  • AVCaptureDevice.supportedFlashModes

  • AVCapturePhotoOutput.availablePhotoPixelFormatTypes

  • AVCapturePhotoOutput.availableRawPhotoPixelFormatTypes

  • AVCapturePhotoSettings.availablePreviewPhotoPixelFormatTypes

    As a workaround you can use the SwiftPrivate versions of these API by prepending each API with double underscore (__). For example, change AVCaptureDevice.Format.supportedColorSpaces to AVCaptureDevice.Format.__supportedColorSpaces.

I can confirm using __availablePreviewPhotoPixelFormatTypes fixes the build errors.

E.g.

let settings = AVCapturePhotoSettings()
let previewPixelType = settings.__availablePreviewPhotoPixelFormatTypes.first!

Source: https://forums.developer.apple.com/thread/86810#259270

查看更多
迷人小祖宗
4楼-- · 2019-01-25 10:54

This bug was present in earlier beta versions of Xcode 9 (rdar://33903950) and was apparently resolved (see this SO question). It's returned for me as well in the GM build. I'm filing rdar ://34412264 about this issue. Hopefully it's resolved soon and another GM build is related; until then, I you can continue working using earlier beta versions of Xcode 9, but won't be able to release that work. This is a total show-stopper for my app.

Edit: I'll also mention that commenting lines pertaining to AVCapturePhotoSettings' preview properties (previewPhotoFormat, kCVPixelBufferPixelFormatTypeKey, kCVPixelBufferWidthKey, etc.) allows your project to build. If it's possible for you to omit these in your project, this may be a good workaround for now.

查看更多
登录 后发表回答