Solved Linking a lib with QT on linux
-
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
-
@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.
-
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.
-
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
and paste link here so we could try run the project ?
-
here is a link to the testApp.zip it should include everything
-
@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.
-
@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*)'
-
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
-
@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 ? -
@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 :)
-
@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 :) -
@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.
-
@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