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

Linking a lib with QT on linux



  • I have created a library with QT on ubuntu-16-04-lts, and I tested it using some command sample code which works without an issue.

    I been trying to create a GUI app with QT, I have tried to link the the library and nothing seem to work, any ideas?

    here is my .pro settings:

    QT += core gui charts
    #CONFIG += console

    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

    TARGET = gui_app
    TEMPLATE = app

    CONFIG += c++11

    #... adding src/inc

    unix:!macx: LIBS += -L$$PWD/../../../fw_console_api/make/linux/ -lfw_console_api

    INCLUDEPATH += $$PWD/../../../fw_console_api/make/linux
    DEPENDPATH += $$PWD/../../../fw_console_api/make/linux


  • Lifetime Qt Champion

    Hi and welcome to the forums

    But the same pro file works just with the
    #CONFIG += console
    enabled ?
    So we know the paths are 100% correct and do link it ?

    • and nothing seem to work

    Do you get any errors or it shows something in the compiler output ?

    or does it crash when you run it ?
    or it what way dont work ?



  • Thank you @mrjj for the replay!

    Even with enabling CONFIG += console still gives me the same error during compiling, which is undefined reference to "library function name"

    I included the library into the .pro file using the "Add a library ..." option, the library is copied to /usr/lib as well as (fw_console_api/make/linux)


  • Lifetime Qt Champion

    @Keith-Harville
    hi
    ok. the sentence
    "tested the library using some command sample code which is fine."
    sounded like it did work in a console app ?

    "undefined reference " sounds like its not finding it so did you check the path carefully ?
    Also the filename is case sensitive so
    its 100% named
    fw_console_api
    ?
    written like that ?

    also try with plain
    LIBS += -L$$PWD/../../../fw_console_api/make/linux/ -lfw_console_api

    I wonder if it must be named lib in front but docs
    https://doc.qt.io/qt-5/third-party-libraries.html
    says
    " It is not necessary to specify the .lib extension, nor the lib prefix (on UNIX platforms)."

    You did compile the LIB with same compiler and Qt as your app ?

    Also is this a SO file or a static lib ? ( .a file)

    Update. Asked a clever friend of mine and since you are on linux, try renaming the so file to
    libfw_console_api
    and see if that helps.
    Also,
    if using a static library, PRE_TARGETDEPS += should be used.
    If the paths are correct then try
    nm and objdump to make sure the symbols were exported/present.



  • On the sentence "tested the library using some command sample code which is fine." I made a test app on command line to test the libfw_console_api.so library, and i was able to link the library and test the function calls successfully.

    I have checked the paths multiple times and copied the library in different places.. still no luck.

    since its SO library, I tired like your friend said "libfw_console_api" but I got "g++: error: libfw_console_api: No such file or directory"

    added .so libfw_console_api.so and now I am back to my original problem "undefined reference to "library function name"

    How do I do the nm and objdump to make sure the symbols


  • Lifetime Qt Champion

    @Keith-Harville said in Linking a lib with QT on linux:

    "g++: error: libfw_console_api: No such file or directory"

    Can you please show your pro file? Because the suggestion from @mrjj is the correct approach to link libraries with qmake.



  • @jsulm @mrjj

    here is my full .pro

    QT += core gui charts
    #CONFIG += console
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    TARGET = frameworkConsole
    TEMPLATE = app
    
    
    CONFIG += c++11 app_bundle
    #CONFIG -= app_bundle
    
    # The following define makes your compiler emit warnings if you use
    # any Qt feature that has been marked deprecated (the exact warnings
    # depend on your compiler). Please consult the documentation of the
    # deprecated API in order to know how to port your code away from it.
    DEFINES += QT_DEPRECATED_WARNINGS
    
    # You can also make your code fail to compile if it uses deprecated APIs.
    # In order to do so, uncomment the following line.
    # You can also select to disable deprecated APIs only up to a certain version of Qt.
    #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    INCLUDEPATH += ../../../../inc
    
    SOURCES += \
        ../../../src/countercontrol.cpp \
        ../../../src/discoveryeventthread.cpp \
        ../../../src/discoveryprogress.cpp \
        ../../../src/dockbutton.cpp \
        ../../../src/enablebutton.cpp \
        ../../../src/frameworkConsole.cpp \
        ../../../src/hdavconfig.cpp \
        ../../../src/main.cpp \
        ../../../src/moduleinfodialog.cpp \
        ../../../src/nodetreeview.cpp \
        ../../../src/playstopbutton.cpp
    
    HEADERS += \
        ../../../src/countercontrol.h \
        ../../../src/discoveryeventthread.h \
        ../../../src/discoveryprogress.h \
        ../../../src/dockbutton.h \
        ../../../src/enablebutton.h \
        ../../../src/frameworkConsole.h \
        ../../../src/hdavconfig.h \
        ../../../src/moduleinfodialog.h \
        ../../../src/nodetreeview.h \
        ../../../src/playstopbutton.h
    
    
    # Default rules for deployment.
    qnx: target.path = /tmp/$${TARGET}/bin
    else: unix:!android: target.path = /opt/$${TARGET}/bin
    !isEmpty(target.path): INSTALLS += target
    
    unix:!macx: LIBS += -L$$PWD/../ -lfw_console_api
    
    INCLUDEPATH += $$PWD/../
    DEPENDPATH += $$PWD/../
    


  • I have created a small test app and made one call to the library as well.

    I can send you the full source for test app as well.


  • Lifetime Qt Champion

    Hi
    If libray is compiled with same compiler and all that is in order, then
    its most of the time just a path issue.

    However, that is hard to test so the mini sample is a good thing.

    Could you upload to say
    https://wetransfer.com/
    and use the get link
    alt text

    and paste link here so we could try run the project ?



  • here is a link to the testApp.zip it should include everything

    https://we.tl/t-TcnN3DZR7b


  • Lifetime Qt Champion

    @Keith-Harville
    Link works.
    However, its seems the cpp for libfw_console_api.so is not included ?

    So we also need to know the gcc version used to compile the test app.
    Just we are sure to use ca. the same version.

    I assume no Qt was used in libfw_console_api so Qt version is not important.


  • Lifetime Qt Champion

    @mrjj said in Linking a lib with QT on linux:

    So we also need to know the gcc version used to compile the test app.

    And the complete error message.



  • gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12)



  • undefined reference to `fwConsole_initConsoleHeader(FW_CONSOLE_HEADER*)'


  • Lifetime Qt Champion

    Since it's a C library you must make sure that the compiler also interpret your header as C ->

    extern "C"
    {
    #include "fw_console_api.h"
    }
    

    Or fix the header so it's not needed for every include of it.



  • Thank you so much, that fixed it


  • Lifetime Qt Champion

    @Christian-Ehrlicher
    Hi
    You are so fast. :)
    What did you run on it too see it was a C lib ?
    or just be looking in the .h file ?


  • Lifetime Qt Champion

    @mrjj said in Linking a lib with QT on linux:

    What did you run on it too see it was a C lib ?

    I got a linker error, looked at the exports and they looked like plain C exports. Then the idea with the wrong symbols was there :)


  • Lifetime Qt Champion

    @Christian-Ehrlicher
    Ok, where did you look at the exports ?
    With objdump or ?
    Im asking as i want to learn. Since you knew so fast and i was still looking at it :)


  • Lifetime Qt Champion

    @mrjj said in Linking a lib with QT on linux:

    With objdump or ?

    Yes, "objdump -T" - take a look at the libfw_console_api.so output and you will notice that they're plain C functions - they are not annotated.


  • Lifetime Qt Champion

    @Christian-Ehrlicher
    Thank you
    Its handy to know. goes on my of list of things to try when you get undefined's and
    checked path many times :=)



  • for the header fix, I added in the header and that took care of it

    #ifdef __cplusplus
    #define FWCONSOLEAPI_DECLSPEC extern  "C"
    #else
    #define FWCONSOLEAPI_DECLSPEC extern
    #endif//__cplusplus
    

    thank you again, you guys are awesome


Log in to reply