Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Linking to external shared library.
QtWS25 Last Chance

Linking to external shared library.

Scheduled Pinned Locked Moved Solved General and Desktop
6 Posts 3 Posters 936 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • C Offline
    C Offline
    Chrisw01
    wrote on last edited by Chrisw01
    #1

    Hello,

    i am using Qt 6.3.1 with Qt Creator 7 on Linux. When i try to call a function in my added C Shared Library i get undefined reference <function>. The linker shows the -L and the l<shared name> in the compile output. There are no errors if I comment out the shared C function . I have moved the shared library and its symbolic links to a library folder and re-ran ldconfig -v and it shows it finds the shared library. When I run ldd on the generated binary it does not list my shared library in the output. Any ideas?

    Thanks..

    1 Reply Last reply
    0
    • Axel SpoerlA Offline
      Axel SpoerlA Offline
      Axel Spoerl
      Moderators
      wrote on last edited by
      #2

      The most common reason for such behaviour is that you link to another (version of the) library. It can also be a dependency of that shared library to another one, but you’d see that in the include statement already.
      Please paste your .pro / CMakeLists.txt, compiler command and output. In Qt creator the latter is in the compiler tab.

      Software Engineer
      The Qt Company, Oslo

      1 Reply Last reply
      0
      • C Offline
        C Offline
        Chrisw01
        wrote on last edited by
        #3

        @Axel-Spoerl Hello and thank you for replying...

        Here is requested snippets

        QT       += core gui
        
        greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
        
        CONFIG += c++17
        
        # You can make your code fail to compile if it uses deprecated APIs.
        # In order to do so, uncomment the following line.
        #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
        
        SOURCES += \
            main.cpp \
            bbsmonitor.cpp
        
        HEADERS += \
            bbsmonitor.h
        
        FORMS += \
            bbsmonitor.ui
        
        INCLUDEPATH += /home/chris/sourceCode/gitCode/falkenbbs/include
        
        # Default rules for deployment.
        qnx: target.path = /tmp/$${TARGET}/bin
        else: unix:!android: target.path = /opt/$${TARGET}/bin
        !isEmpty(target.path): INSTALLS += target
        
        win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../../gitCode/falkenbbs/shared/release/ -lfalken
        else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../../gitCode/falkenbbs/shared/debug/ -lfalken
        else:unix: LIBS += -L$$PWD/../../../gitCode/falkenbbs/shared/ -lfalken
        
        DEPENDPATH += $$PWD/../../../gitCode/falkenbbs/shared
        
        

        And the compiled output

        07:32:34: Running steps for project bbsMonitor...
        07:32:34: Configuration unchanged, skipping qmake step.
        07:32:34: Starting: "/usr/bin/make" -j2
        /home/chris/Qt/6.3.1/gcc_64/libexec/uic ../bbsMonitor/bbsmonitor.ui -o ui_bbsmonitor.h
        g++ -c -pipe -g -std=gnu++1z -Wall -Wextra -D_REENTRANT -fPIC -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../bbsMonitor -I. -I../../../gitCode/falkenbbs/include -I../../../../Qt/6.3.1/gcc_64/include -I../../../../Qt/6.3.1/gcc_64/include/QtWidgets -I../../../../Qt/6.3.1/gcc_64/include/QtGui -I../../../../Qt/6.3.1/gcc_64/include/QtCore -I. -I. -I../../../../Qt/6.3.1/gcc_64/mkspecs/linux-g++ -o main.o ../bbsMonitor/main.cpp
        g++ -pipe -g -std=gnu++1z -Wall -Wextra -dM -E -o moc_predefs.h ../../../../Qt/6.3.1/gcc_64/mkspecs/features/data/dummy.cpp
        g++ -c -pipe -g -std=gnu++1z -Wall -Wextra -D_REENTRANT -fPIC -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../bbsMonitor -I. -I../../../gitCode/falkenbbs/include -I../../../../Qt/6.3.1/gcc_64/include -I../../../../Qt/6.3.1/gcc_64/include/QtWidgets -I../../../../Qt/6.3.1/gcc_64/include/QtGui -I../../../../Qt/6.3.1/gcc_64/include/QtCore -I. -I. -I../../../../Qt/6.3.1/gcc_64/mkspecs/linux-g++ -o bbsmonitor.o ../bbsMonitor/bbsmonitor.cpp
        /home/chris/Qt/6.3.1/gcc_64/libexec/moc -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB --include /home/chris/sourceCode/qtCode/falkenbbs/build-bbsMonitor-Desktop_Qt_6_3_1_GCC_64bit-Debug/moc_predefs.h -I/home/chris/Qt/6.3.1/gcc_64/mkspecs/linux-g++ -I/home/chris/sourceCode/qtCode/falkenbbs/bbsMonitor -I/home/chris/sourceCode/gitCode/falkenbbs/include -I/home/chris/Qt/6.3.1/gcc_64/include -I/home/chris/Qt/6.3.1/gcc_64/include/QtWidgets -I/home/chris/Qt/6.3.1/gcc_64/include/QtGui -I/home/chris/Qt/6.3.1/gcc_64/include/QtCore -I. -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/include/x86_64-linux-gnu -I/usr/include ../bbsMonitor/bbsmonitor.h -o moc_bbsmonitor.cpp
        g++ -c -pipe -g -std=gnu++1z -Wall -Wextra -D_REENTRANT -fPIC -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../bbsMonitor -I. -I../../../gitCode/falkenbbs/include -I../../../../Qt/6.3.1/gcc_64/include -I../../../../Qt/6.3.1/gcc_64/include/QtWidgets -I../../../../Qt/6.3.1/gcc_64/include/QtGui -I../../../../Qt/6.3.1/gcc_64/include/QtCore -I. -I. -I../../../../Qt/6.3.1/gcc_64/mkspecs/linux-g++ -o moc_bbsmonitor.o moc_bbsmonitor.cpp
        g++ -Wl,-rpath,/home/chris/Qt/6.3.1/gcc_64/lib -Wl,-rpath-link,/home/chris/Qt/6.3.1/gcc_64/lib -o bbsMonitor  main.o bbsmonitor.o moc_bbsmonitor.o   -L/home/chris/sourceCode/qtCode/falkenbbs/bbsMonitor/../../../gitCode/falkenbbs/shared/ -lfalken /home/chris/Qt/6.3.1/gcc_64/lib/libQt6Widgets.so /home/chris/Qt/6.3.1/gcc_64/lib/libQt6Gui.so /home/chris/Qt/6.3.1/gcc_64/lib/libQt6Core.so -lpthread -lGL   
        07:32:38: The process "/usr/bin/make" exited normally.
        07:32:38: Elapsed time: 00:04.
        
        

        And when you run ldd against the binary this is the output...

        	linux-vdso.so.1 (0x00007ffec90f4000)
        	libQt6Widgets.so.6 => /home/chris/Qt/6.3.1/gcc_64/lib/libQt6Widgets.so.6 (0x00007f1e5f0c3000)
        	libQt6Core.so.6 => /home/chris/Qt/6.3.1/gcc_64/lib/libQt6Core.so.6 (0x00007f1e5ea60000)
        	libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f1e5e86a000)
        	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f1e5e84f000)
        	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1e5e65d000)
        	libQt6Gui.so.6 => /home/chris/Qt/6.3.1/gcc_64/lib/libQt6Gui.so.6 (0x00007f1e5dcda000)
        	libGL.so.1 => /lib/x86_64-linux-gnu/libGL.so.1 (0x00007f1e5dc50000)
        	libxkbcommon.so.0 => /lib/x86_64-linux-gnu/libxkbcommon.so.0 (0x00007f1e5dc0e000)
        	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f1e5dbeb000)
        	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1e5da9c000)
        	libicui18n.so.56 => /home/chris/Qt/6.3.1/gcc_64/lib/libicui18n.so.56 (0x00007f1e5d603000)
        	libicuuc.so.56 => /home/chris/Qt/6.3.1/gcc_64/lib/libicuuc.so.56 (0x00007f1e5d24b000)
        	libicudata.so.56 => /home/chris/Qt/6.3.1/gcc_64/lib/libicudata.so.56 (0x00007f1e5b866000)
        	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1e5b860000)
        	libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f1e5b737000)
        	libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f1e5b71b000)
        	libgthread-2.0.so.0 => /lib/x86_64-linux-gnu/libgthread-2.0.so.0 (0x00007f1e5b716000)
        	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f1e5b70c000)
        	/lib64/ld-linux-x86-64.so.2 (0x00007f1e5f7f5000)
        	libEGL.so.1 => /lib/x86_64-linux-gnu/libEGL.so.1 (0x00007f1e5b6f5000)
        	libfontconfig.so.1 => /lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f1e5b6ae000)
        	libX11.so.6 => /lib/x86_64-linux-gnu/libX11.so.6 (0x00007f1e5b571000)
        	libQt6DBus.so.6 => /home/chris/Qt/6.3.1/gcc_64/lib/libQt6DBus.so.6 (0x00007f1e5b4a1000)
        	libfreetype.so.6 => /lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f1e5b3e2000)
        	libGLdispatch.so.0 => /lib/x86_64-linux-gnu/libGLdispatch.so.0 (0x00007f1e5b328000)
        	libGLX.so.0 => /lib/x86_64-linux-gnu/libGLX.so.0 (0x00007f1e5b2f4000)
        	libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f1e5b281000)
        	libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f1e5b253000)
        	libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007f1e5b24a000)
        	libxcb.so.1 => /lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f1e5b220000)
        	libdbus-1.so.3 => /lib/x86_64-linux-gnu/libdbus-1.so.3 (0x00007f1e5b1cd000)
        	libpng16.so.16 => /lib/x86_64-linux-gnu/libpng16.so.16 (0x00007f1e5b195000)
        	libXau.so.6 => /lib/x86_64-linux-gnu/libXau.so.6 (0x00007f1e5b18f000)
        	libXdmcp.so.6 => /lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f1e5b187000)
        	libsystemd.so.0 => /lib/x86_64-linux-gnu/libsystemd.so.0 (0x00007f1e5b0d8000)
        	libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f1e5b0bc000)
        	liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f1e5b093000)
        	liblz4.so.1 => /lib/x86_64-linux-gnu/liblz4.so.1 (0x00007f1e5b072000)
        	libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x00007f1e5af54000)
        	libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007f1e5af31000)
        

        As you can see libfalken is not linked to the binary. Even if I was missing a symbolic link it would still show the library with a Not Found error.

        I've tried with CMake and it showed the library being linked in compiler tab but same outcome so I switched to QMake and added the library via the Add Library tab. If I put a function in my code from the library it will error out.

        Thanks...

        1 Reply Last reply
        0
        • Christian EhrlicherC Offline
          Christian EhrlicherC Offline
          Christian Ehrlicher
          Lifetime Qt Champion
          wrote on last edited by
          #4

          Then you maybe don't use any function from this library so the linker doesn't need to add it. qmake pass the correct flags to g++/the linker so it's not a qmake (or cmake) problem.

          Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
          Visit the Qt Academy at https://academy.qt.io/catalog

          C 1 Reply Last reply
          0
          • C Offline
            C Offline
            Chrisw01
            wrote on last edited by
            #5

            When I try to use a function from that library it fails to compile

            09:40:55: Running steps for project bbsMonitor...
            09:40:55: Configuration unchanged, skipping qmake step.
            09:40:55: Starting: "/usr/bin/make" -j2
            g++ -c -pipe -g -std=gnu++1z -Wall -Wextra -D_REENTRANT -fPIC -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../bbsMonitor -I. -I../../../gitCode/falkenbbs/include -I../../../../Qt/6.3.1/gcc_64/include -I../../../../Qt/6.3.1/gcc_64/include/QtWidgets -I../../../../Qt/6.3.1/gcc_64/include/QtGui -I../../../../Qt/6.3.1/gcc_64/include/QtCore -I. -I. -I../../../../Qt/6.3.1/gcc_64/mkspecs/linux-g++ -o bbsmonitor.o ../bbsMonitor/bbsmonitor.cpp
            g++ -Wl,-rpath,/home/chris/Qt/6.3.1/gcc_64/lib -Wl,-rpath-link,/home/chris/Qt/6.3.1/gcc_64/lib -o bbsMonitor  main.o bbsmonitor.o moc_bbsmonitor.o   -L/home/chris/sourceCode/qtCode/falkenbbs/bbsMonitor/../../../gitCode/falkenbbs/shared/ -lfalken /home/chris/Qt/6.3.1/gcc_64/lib/libQt6Widgets.so /home/chris/Qt/6.3.1/gcc_64/lib/libQt6Gui.so /home/chris/Qt/6.3.1/gcc_64/lib/libQt6Core.so -lpthread -lGL   
            /usr/bin/ld: bbsmonitor.o: in function `bbsMonitor::bbsMonitor(QWidget*)':
            /home/chris/sourceCode/qtCode/falkenbbs/build-bbsMonitor-Desktop_Qt_6_3_1_GCC_64bit-Debug/../bbsMonitor/bbsmonitor.cpp:10: undefined reference to `util_init()'
            collect2: error: ld returned 1 exit status
            make: *** [Makefile:342: bbsMonitor] Error 1
            09:40:58: The process "/usr/bin/make" exited with code 2.
            Error while building/deploying project bbsMonitor (kit: Desktop Qt 6.3.1 GCC 64bit)
            When executing step "Make"
            09:40:58: Elapsed time: 00:03.
            

            The util_init function resides within the library I have linked to the binary. Actually calling any function within the library generates the same error...

            1 Reply Last reply
            0
            • Christian EhrlicherC Christian Ehrlicher

              Then you maybe don't use any function from this library so the linker doesn't need to add it. qmake pass the correct flags to g++/the linker so it's not a qmake (or cmake) problem.

              C Offline
              C Offline
              Chrisw01
              wrote on last edited by
              #6

              @Christian-Ehrlicher said in Linking to external shared library.:

              Then you maybe don't use any function from this library so the linker doesn't need to add it. qmake pass the correct flags to g++/the linker so it's not a qmake (or cmake) problem.

              Hey, thanks, you made me rethink things... And you were 100% correct. I needed to declare the function as an extern "C" function. Once that was done it compiles and works great!

              Thanks for the insight..

              1 Reply Last reply
              1

              • Login

              • Login or register to search.
              • First post
                Last post
              0
              • Categories
              • Recent
              • Tags
              • Popular
              • Users
              • Groups
              • Search
              • Get Qt Extensions
              • Unsolved