Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Apple Mach-O Linker (ld) Error Group with Swift 3 & Xcode 9 GM

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]
like image 557
Gizmodo Avatar asked Sep 13 '17 15:09

Gizmodo


Video Answer


2 Answers

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

like image 125
gbhall Avatar answered Oct 08 '22 17:10

gbhall


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.

like image 26
Naloiko Eugene Avatar answered Oct 08 '22 19:10

Naloiko Eugene