Search code examples
objective-ccocoaswiftcoda

Trying to use Swift with Obj C header for Coda2 plugin. Getting error: Undefined symbols for architecture x86_64


Trying to build a PlugIn for Coda 2.5 with swift.I'm getting this error:

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_CodaPlugInsController", referenced from:
      _get_field_types_PowPlugInViewController in PowPlugInViewController.o
      _get_field_types_PowPlugIn in PowPlugin.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

I have cleaned my build folder. I have created and added import statements to the project name-bridging-swift.h.

Here is a look at my project.

CodaPlugInsController.h

You can find this file here. https://github.com/panicinc/CodaPluginKit/tree/master/Cocoa%20Plug-ins Discription: This header provides protocols and facilities to implement Coda text-based, syntax validator and sidebar plug-in.

CodaPow-Bridging-Header.h

//
//  Use this file to import your target's public headers that you would like to expose to Swift.
//

#import "CodaPlugInsController.h"

PowPlugin.swift

import Foundation

class PowPlugIn: NSObject, CodaPlugIn, CodaSidebarPlugIn {
    let PowBundle: CodaPlugInBundle
    let PowController: CodaPlugInsController

    required init(plugInController: CodaPlugInsController, plugInBundle: CodaPlugInBundle) {
        self.PowBundle = plugInBundle
        self.PowController = plugInController
        super.init()
    }

    func name() -> String {
        return "Coda Pow"
    }

    func didLoadSiteNamed(name: String!) {

    }

    func viewController() -> NSViewController {
       return PowPlugInViewController(nibName: "PowPlugInView", plugInBundle: PowBundle, plugInController: PowController)!
    }
}

PowPlugInViewController.swift

import Foundation

class PowPlugInViewController: NSViewController, CodaSidebarViewController {
    let PowController: CodaPlugInsController
    init?(nibName: String, plugInBundle: AnyObject, plugInController: CodaPlugInsController) {
        self.PowController = plugInController
        super.init(nibName: nibName, bundle: plugInBundle as? NSBundle)
    }
    //  Xcode Says I need this.
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

I have two more source files. ServerAndHosts.swift and Shell.swift They don't use any of the classes in CodaPlugInsController.h. The Shell.swift file is just a set of Class functions.

Edit: I can use swift as long as I don't subclass from the CodaPlugInsController.h or pass in an object that has been.

Swift and Obj-C versions of Project: https://www.dropbox.com/sh/bsw8cinn7kp9kfe/AAAgG_B44dbHNP5-JwJ3Amf8a?dl=0


Solution

  • The project compiles, so the bridging headers may not be the issue.

    You fail at the linking stage, the compiler can't find a set of symbols for your current architecture. This could either mean

    1) The Coda library is not compiled for your architecture

    or

    2) the linker couldn't find the library at all.

    I looked at your Obj-C project, and it appears the Coda library is not in the project, so I'm guessing its #2. You'll either want to move the lib into the project somehow, or add a path to the lib elsewhere on your system in your project's "library search paths"