Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Calling native function of an iOS static library (Objective-C code) from a QT widget based application



  • Hi All,

    I am having a simple Qt 5.4 widget based application and I am trying to call a native function (member function of an Objective-C class) that I have written. I followed the solution posted on this link : https://forum.qt.io/topic/46793/solved-using-objective-c-class-in-qt-c.
    Unfortunately I am still getting the error mentioned in the above link :

    symbol(s) not found for architecture ...
    linker command failed with exit code 1 ...

    I would like to know

    1. If there is any standard (QT prescribed) way of calling native code from QT application (widget based).
    2. If it is possible to call a native function from an iOS static library (from .a library and not by including the source files in QT project)

    Thanks in advance...


  • Lifetime Qt Champion

    Hi and welcome to devnet,

    1. You can have a look at the qtmacextras module to see how you can use Objective-C++
    2. What symbols are missing ? Are you linking to that library properly ?


  • Hi,
    Thanks for the reply.

    1. Ok, I will have a look at qtmacextras
    2. The error I am getting is - "symbol(s) not found for architecture x86_64". I am new to QT and I am not sure if I am linking the library properly. Can you please guide me on this?
      Also, is it better to use QT Creator or XCode if I need to mix QT and Objective-C++ code ?


  • You are giving us an incomplete error message.
    Look in the "Compile output" view to see what symbols are not found.



  • @sachin.srinath said:

    1. If there is any standard (QT prescribed) way of calling native code from QT application (widget based).
    2. If it is possible to call a native function from an iOS static library (from .a library and not by including the source files in QT project)

    It may not have a standard way of calling native code. I just made my own solution , and available at :
    https://github.com/benlau/quickios/blob/master/qisystemutils.mm#L362

    The native code is written in .mm file. C++ code won't be able to call them directly. Instead , all the native code registers their exported functions on a messenger class. And C++ code access those functions via the messenger class too. That make the code be able to be compiled on other platform. (e.g having a CI server in Linux , use it to run test case related to data model)



  • @sandy.martel23
    Here is the complete error:

    14:29:15: Running steps for project try1...

    14:29:15: Configuration unchanged, skipping qmake step.

    14:29:15: Starting: "/usr/bin/make"

    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -headerpad_max_install_names -Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -mmacosx-version-min=10.7 -Wl,-rpath,/Users/BTL/Qt5.4.1_ios/5.4/clang_64/lib -o try1.app/Contents/MacOS/try1 native.o main.o mainwindow.o moc_mainwindow.o -F/Users/BTL/Qt5.4.1_ios/5.4/clang_64/lib -framework QtWidgets -framework QtGui -framework QtCore -framework DiskArbitration -framework IOKit -framework OpenGL -framework AGL

    Undefined symbols for architecture x86_64:

    "_NSLog", referenced from:

    -[MyClass doSomething] in native.o

    "OBJC_CLASS$_NSObject", referenced from:

    OBJC_CLASS$_MyClass in native.o

    "OBJC_METACLASS$_NSObject", referenced from:

    OBJC_METACLASS$_MyClass in native.o

    "___CFConstantStringClassReference", referenced from:

    CFString in native.o

    "__objc_empty_cache", referenced from:

    OBJC_METACLASS$_MyClass in native.o

    OBJC_CLASS$_MyClass in native.o

    "__objc_empty_vtable", referenced from:

    OBJC_METACLASS$_MyClass in native.o

    OBJC_CLASS$_MyClass in native.o

    ld: symbol(s) not found for architecture x86_64

    clang: error: linker command failed with exit code 1 (use -v to see invocation)

    make: *** [try1.app/Contents/MacOS/try1] Error 1

    14:29:16: The process "/usr/bin/make" exited with code 2.

    Error while building/deploying project try1 (kit: Desktop Qt 5.4.1 clang 64bit)

    When executing step "Make"

    14:29:16: Elapsed time: 00:00.



  • @Ben-Lau

    Thanks for sharing the code. I will have a look at it.


  • Lifetime Qt Champion

    Is it me or are you trying to build something for iOS using the OS X Qt version ?



  • @sachin.srinath

    Looks like you are not linking with Foundation. Add

    LIBS += -framework Foundation

    To your .pro file.



  • @sandy.martel23
    Thanks very much. Its working fine now.

    Thanks everyone for helping me.


Log in to reply