Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. 3rd Party Software
  4. undefined reference - Help first time external header library QT C++ [Linux]

undefined reference - Help first time external header library QT C++ [Linux]

Scheduled Pinned Locked Moved Unsolved 3rd Party Software
c++libraryreference error
14 Posts 3 Posters 2.4k 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.
  • LudoFRL LudoFR

    @JonB said in undefined reference - Help first time external header library QT C++ [Linux]:

    @LudoFR
    Does it help if you write it as ::DapiOpenModuleEx(...)?
    As @SGaist says below. I didn't notice it was a linker error.

    @SGaist said in undefined reference - Help first time external header library QT C++ [Linux]:

    Hi,

    Aren't you forgetting to link to the library that provided these symbols ?

    damn yea right..

    I have the added full library folder into my project folder like this :
    d47c753b-bda1-4dd9-8fec-a4ce92fb5ba1-image.png

    Now my *.pro file :

    QT += quick
    
    SOURCES += \
            main.cpp
    
    resources.files = main.qml 
    resources.prefix = /$${TARGET}
    RESOURCES += resources
    
    # Additional import path used to resolve QML modules in Qt Creator's code model
    QML_IMPORT_PATH =
    
    # Additional import path used to resolve QML modules just for Qt Quick Designer
    QML_DESIGNER_IMPORT_PATH =
    
    # 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/delib/lib/build_x64/ -lDelibTcp
    
    INCLUDEPATH += $$PWD/delib
    DEPENDPATH += $$PWD/delib
    

    and my compile ouput window :

    08:54:36: Running steps for project DeditecQuickCpp...
    08:54:36: Configuration unchanged, skipping qmake step.
    08:54:36: Starting: "/usr/bin/make" -j20
    g++ -c -pipe -g -Wall -Wextra -fPIC -D_REENTRANT -DQT_QML_DEBUG -DQT_QUICK_LIB -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_QMLMODELS_LIB -DQT_QML_LIB -DQT_QMLINTEGRATION_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I../DeditecQuickCpp -I. -I../DeditecQuickCpp/delib -I../../../../Qt/6.4.2/gcc_64/include -I../../../../Qt/6.4.2/gcc_64/include/QtQuick -I../../../../Qt/6.4.2/gcc_64/include/QtOpenGL -I../../../../Qt/6.4.2/gcc_64/include/QtGui -I../../../../Qt/6.4.2/gcc_64/include/QtQmlModels -I../../../../Qt/6.4.2/gcc_64/include/QtQml -I../../../../Qt/6.4.2/gcc_64/include/QtQmlIntegration -I../../../../Qt/6.4.2/gcc_64/include/QtNetwork -I../../../../Qt/6.4.2/gcc_64/include/QtCore -I. -I../../../../Qt/6.4.2/gcc_64/mkspecs/linux-g++ -o main.o ../DeditecQuickCpp/main.cpp
    In file included from ../DeditecQuickCpp/main.cpp:5:
    ../DeditecQuickCpp/delib/library/delib/delib.h:347:53: note: ‘#pragma message: DELIB.H Mode for C++ used’
      347 |         #pragma message ("DELIB.H Mode for C++ used")
          |                                                     ^
    g++ -Wl,-rpath,/home/ludo/Qt/6.4.2/gcc_64/lib -Wl,-rpath-link,/home/ludo/Qt/6.4.2/gcc_64/lib -o DeditecQuickCpp  main.o qrc_qmake_resources.o   -L/home/ludo/Documents/Dev_C/QT/DeditecQuickCpp/delib/lib/build_x64/ -lDelibTcp /home/ludo/Qt/6.4.2/gcc_64/lib/libQt6Quick.so /home/ludo/Qt/6.4.2/gcc_64/lib/libQt6OpenGL.so /home/ludo/Qt/6.4.2/gcc_64/lib/libQt6Gui.so /home/ludo/Qt/6.4.2/gcc_64/lib/libQt6QmlModels.so /home/ludo/Qt/6.4.2/gcc_64/lib/libQt6Qml.so -pthread /home/ludo/Qt/6.4.2/gcc_64/lib/libQt6Network.so /home/ludo/Qt/6.4.2/gcc_64/lib/libQt6Core.so -lpthread -lGL   
    /usr/bin/ld: main.o: in function `main':
    /home/ludo/Documents/Dev_C/QT/build-DeditecQuickCpp-Desktop_Qt_6_4_2_GCC_64bit-Debug/../DeditecQuickCpp/main.cpp:23: undefined reference to `DapiOpenModuleEx'
    collect2: error: ld returned 1 exit status
    make: *** [Makefile:211: DeditecQuickCpp] Error 1
    08:54:37: The process "/usr/bin/make" exited with code 2.
    Error while building/deploying project DeditecQuickCpp (kit: Desktop Qt 6.4.2 GCC 64bit)
    When executing step "Make"
    08:54:37: Elapsed time: 00:01.
    
    JonBJ Offline
    JonBJ Offline
    JonB
    wrote on last edited by
    #5

    @LudoFR
    What files are in /home/ludo/Documents/Dev_C/QT/DeditecQuickCpp/delib/lib/build_x64/? How were the libraries there built, and who built them?

    LudoFRL 1 Reply Last reply
    0
    • JonBJ JonB

      @LudoFR
      What files are in /home/ludo/Documents/Dev_C/QT/DeditecQuickCpp/delib/lib/build_x64/? How were the libraries there built, and who built them?

      LudoFRL Offline
      LudoFRL Offline
      LudoFR
      wrote on last edited by LudoFR
      #6

      @JonB

      Here the script for compiling the *.so library :

      #!/bin/bash
      
      flags="-Wall -Werror"
      lib_name=./build_x64/libDelibTcp
      
      list_of_source_files="
      blowfish.c
      deditec_encryption_utils.c
      delib_io_tcp_encryption.c
      -g"
       
      list_of_object_files="
      blowfish.o
      deditec_encryption_utils.o
      delib_io_tcp_encryption.o
      -g"
       
      echo now compiling $lib_name
      gcc -c $flags -fpic $list_of_source_files
      
      if [ $? != "0" ]
         then echo
              echo "error(s) found while compiling"
              exit 100
         else echo
              gcc -shared -o $lib_name.so $list_of_object_files
      		rm *.o
      		echo "lib created"
      fi
      

      Following the documentation

      Here the files used for compilation.
      1fe55a9e-c0ac-49b1-9057-f1a51e63364e-image.png

      Sorry I'm kind of beginner with Linux and C++ globally (too much time on windows and C# sadly for me)

      JonBJ 1 Reply Last reply
      0
      • LudoFRL LudoFR

        @JonB

        Here the script for compiling the *.so library :

        #!/bin/bash
        
        flags="-Wall -Werror"
        lib_name=./build_x64/libDelibTcp
        
        list_of_source_files="
        blowfish.c
        deditec_encryption_utils.c
        delib_io_tcp_encryption.c
        -g"
         
        list_of_object_files="
        blowfish.o
        deditec_encryption_utils.o
        delib_io_tcp_encryption.o
        -g"
         
        echo now compiling $lib_name
        gcc -c $flags -fpic $list_of_source_files
        
        if [ $? != "0" ]
           then echo
                echo "error(s) found while compiling"
                exit 100
           else echo
                gcc -shared -o $lib_name.so $list_of_object_files
        		rm *.o
        		echo "lib created"
        fi
        

        Following the documentation

        Here the files used for compilation.
        1fe55a9e-c0ac-49b1-9057-f1a51e63364e-image.png

        Sorry I'm kind of beginner with Linux and C++ globally (too much time on windows and C# sadly for me)

        JonBJ Offline
        JonBJ Offline
        JonB
        wrote on last edited by
        #7

        @LudoFR
        These are the files in the lib directory. I asked to see the files in the lib/build_x64 subdirectory.

        LudoFRL 1 Reply Last reply
        0
        • JonBJ JonB

          @LudoFR
          These are the files in the lib directory. I asked to see the files in the lib/build_x64 subdirectory.

          LudoFRL Offline
          LudoFRL Offline
          LudoFR
          wrote on last edited by
          #8

          @JonB No files into this folder, its just the lib compilation ouput folder

          JonBJ 1 Reply Last reply
          0
          • LudoFRL LudoFR

            @JonB No files into this folder, its just the lib compilation ouput folder

            JonBJ Offline
            JonBJ Offline
            JonB
            wrote on last edited by JonB
            #9

            @LudoFR
            Umm, if there are no files in that folder then there is no library to link against....!

            Did you actually run the script to build the library?

            lib_name=./build_x64/libDelibTcp

            I am expecting to see that created at least build_x64/libDelibTcp.so.

            LudoFRL 1 Reply Last reply
            0
            • JonBJ JonB

              @LudoFR
              Umm, if there are no files in that folder then there is no library to link against....!

              Did you actually run the script to build the library?

              lib_name=./build_x64/libDelibTcp

              I am expecting to see that created at least build_x64/libDelibTcp.so.

              LudoFRL Offline
              LudoFRL Offline
              LudoFR
              wrote on last edited by LudoFR
              #10

              @JonB

              Yes I run the script :

              0_make_tcp_encryption_lib_x64.sh
              

              Sorry my fault, there is no files except the libDelibTcp.so

              944f831d-98ef-42ed-a4da-8f104da909b6-image.png

              Compilation output from QT look different, (I do not have change anything)

              09:47:57: Running steps for project DeditecQuickCpp...
              09:47:57: Configuration unchanged, skipping qmake step.
              09:47:57: Starting: "/usr/bin/make" -j20
              g++ -Wl,-rpath,/home/ludo/Qt/6.4.2/gcc_64/lib -Wl,-rpath-link,/home/ludo/Qt/6.4.2/gcc_64/lib -o DeditecQuickCpp  main.o qrc_qmake_resources.o   -L/home/ludo/Documents/Dev_C/QT/DeditecQuickCpp/delib/lib/build_x64/ -lDelibTcp /home/ludo/Qt/6.4.2/gcc_64/lib/libQt6Quick.so /home/ludo/Qt/6.4.2/gcc_64/lib/libQt6OpenGL.so /home/ludo/Qt/6.4.2/gcc_64/lib/libQt6Gui.so /home/ludo/Qt/6.4.2/gcc_64/lib/libQt6QmlModels.so /home/ludo/Qt/6.4.2/gcc_64/lib/libQt6Qml.so -pthread /home/ludo/Qt/6.4.2/gcc_64/lib/libQt6Network.so /home/ludo/Qt/6.4.2/gcc_64/lib/libQt6Core.so -lpthread -lGL   
              /usr/bin/ld: main.o: in function `main':
              /home/ludo/Documents/Dev_C/QT/build-DeditecQuickCpp-Desktop_Qt_6_4_2_GCC_64bit-Debug/../DeditecQuickCpp/main.cpp:23: undefined reference to `DapiOpenModuleEx'
              collect2: error: ld returned 1 exit status
              make: *** [Makefile:211: DeditecQuickCpp] Error 1
              09:47:57: The process "/usr/bin/make" exited with code 2.
              Error while building/deploying project DeditecQuickCpp (kit: Desktop Qt 6.4.2 GCC 64bit)
              When executing step "Make"
              09:47:57: Elapsed time: 00:00.
              
              
              JonBJ 1 Reply Last reply
              0
              • LudoFRL LudoFR

                @JonB

                Yes I run the script :

                0_make_tcp_encryption_lib_x64.sh
                

                Sorry my fault, there is no files except the libDelibTcp.so

                944f831d-98ef-42ed-a4da-8f104da909b6-image.png

                Compilation output from QT look different, (I do not have change anything)

                09:47:57: Running steps for project DeditecQuickCpp...
                09:47:57: Configuration unchanged, skipping qmake step.
                09:47:57: Starting: "/usr/bin/make" -j20
                g++ -Wl,-rpath,/home/ludo/Qt/6.4.2/gcc_64/lib -Wl,-rpath-link,/home/ludo/Qt/6.4.2/gcc_64/lib -o DeditecQuickCpp  main.o qrc_qmake_resources.o   -L/home/ludo/Documents/Dev_C/QT/DeditecQuickCpp/delib/lib/build_x64/ -lDelibTcp /home/ludo/Qt/6.4.2/gcc_64/lib/libQt6Quick.so /home/ludo/Qt/6.4.2/gcc_64/lib/libQt6OpenGL.so /home/ludo/Qt/6.4.2/gcc_64/lib/libQt6Gui.so /home/ludo/Qt/6.4.2/gcc_64/lib/libQt6QmlModels.so /home/ludo/Qt/6.4.2/gcc_64/lib/libQt6Qml.so -pthread /home/ludo/Qt/6.4.2/gcc_64/lib/libQt6Network.so /home/ludo/Qt/6.4.2/gcc_64/lib/libQt6Core.so -lpthread -lGL   
                /usr/bin/ld: main.o: in function `main':
                /home/ludo/Documents/Dev_C/QT/build-DeditecQuickCpp-Desktop_Qt_6_4_2_GCC_64bit-Debug/../DeditecQuickCpp/main.cpp:23: undefined reference to `DapiOpenModuleEx'
                collect2: error: ld returned 1 exit status
                make: *** [Makefile:211: DeditecQuickCpp] Error 1
                09:47:57: The process "/usr/bin/make" exited with code 2.
                Error while building/deploying project DeditecQuickCpp (kit: Desktop Qt 6.4.2 GCC 64bit)
                When executing step "Make"
                09:47:57: Elapsed time: 00:00.
                
                
                JonBJ Offline
                JonBJ Offline
                JonB
                wrote on last edited by JonB
                #11

                @LudoFR
                Because I am a very nice guy [ ;-) ] I downloaded your "deditec" library stuff for Linux and set up a tiny project to use it. I get the same "undefined" on any Dapi... call as you do.

                So then I went ran on lib/build_x64/libDelibTcp.so (I just used the one already compiled there)

                nm --dynamic libDelibTcp.so
                

                This shows me all the symbols defined/exported in libDelibTcp.so. And there is nothing even vaguely like Dapi... anything there. Just some Blowfish... and dt_... functions.

                So.... I don't know what you are supposed to be using (I'm not going to read the whole Delib documenation). But I can only conclude that including the delib.h stuff which declares Dapi... functions requires something very different from (at least the currently built) libDelibTcp.so content to link against....

                The script name indicates to me that it is just for some encryption routines (0_make_tcp_encryption_lib_x64.sh). I think there is quite some other library you are supposed to be linking against for anything Dapi...??

                In the delib directory I see all the delib_Dapi_... source files. I suspect that is what needs building? I see your DapiOpenModuleEx implementation is defined in file delib_open_close.cpp.

                Maybe go look in the supplied samples directory? There I see e.g. 1_compile_usb_sample.sh. Looking in that I see a gcc command which explicitly compiles and links a whole bunch of the source files, including a couple of delib_Dapi... ones. Does this indicate how you are supposed to do it? So no library for those source files, rather you are supposed to compile them to .o files and link them against your code? Same for the "ethernet" sample, which includes a readme.txt, clarifying that libDelibTcp.so is only to do with encryption....

                LudoFRL 1 Reply Last reply
                1
                • JonBJ JonB

                  @LudoFR
                  Because I am a very nice guy [ ;-) ] I downloaded your "deditec" library stuff for Linux and set up a tiny project to use it. I get the same "undefined" on any Dapi... call as you do.

                  So then I went ran on lib/build_x64/libDelibTcp.so (I just used the one already compiled there)

                  nm --dynamic libDelibTcp.so
                  

                  This shows me all the symbols defined/exported in libDelibTcp.so. And there is nothing even vaguely like Dapi... anything there. Just some Blowfish... and dt_... functions.

                  So.... I don't know what you are supposed to be using (I'm not going to read the whole Delib documenation). But I can only conclude that including the delib.h stuff which declares Dapi... functions requires something very different from (at least the currently built) libDelibTcp.so content to link against....

                  The script name indicates to me that it is just for some encryption routines (0_make_tcp_encryption_lib_x64.sh). I think there is quite some other library you are supposed to be linking against for anything Dapi...??

                  In the delib directory I see all the delib_Dapi_... source files. I suspect that is what needs building? I see your DapiOpenModuleEx implementation is defined in file delib_open_close.cpp.

                  Maybe go look in the supplied samples directory? There I see e.g. 1_compile_usb_sample.sh. Looking in that I see a gcc command which explicitly compiles and links a whole bunch of the source files, including a couple of delib_Dapi... ones. Does this indicate how you are supposed to do it? So no library for those source files, rather you are supposed to compile them to .o files and link them against your code? Same for the "ethernet" sample, which includes a readme.txt, clarifying that libDelibTcp.so is only to do with encryption....

                  LudoFRL Offline
                  LudoFRL Offline
                  LudoFR
                  wrote on last edited by
                  #12

                  @JonB Wow, really I want to thank you for your effort, this mean a lot seriously.

                  To be honest, this is why I think for the start because this lib is totally different from the one I use in C#.

                  So if I understand good I need to compile all files listed here :

                  #!/bin/bash
                  
                  bin_name=ethernet_sample
                  preprocessor_defines="-D USE_ETH"
                  
                  list_of_files="
                  source/ethernet_sample.c
                  
                  ../../delib-sources/delib/library/vc/deditec_timer.c
                  ../../delib-sources/delib/library/vc/deditec_tcp_io.c
                  ../../delib-sources/delib/library/vc/deditec_buff_utils.c
                  ../../delib-sources/delib/library/vc/deditec_string_utils.c
                  ../../delib-sources/delib/library/vc/deditec_convert_functions.c
                  ../../delib-sources/delib/library/embedded/deditec_debug_comfort.c
                  
                  ../../delib-sources/delib/delib_hdlmgr.c
                  ../../delib-sources/delib/delib_packet_statistic.c
                  ../../delib-sources/delib/delib_Dapi_di_do_ad_da_befehle.c
                  ../../delib-sources/delib/delib_set_get_error.c
                  ../../delib-sources/delib/delib_Dapi_register_commands.c
                  ../../delib-sources/delib/delib_open_close.c
                  ../../delib-sources/delib/delib_io_tcp.c
                  -g"
                  
                  echo now compiling $bin_name
                  gcc $preprocessor_defines -o $bin_name $list_of_files
                  
                  if [ $? != "0" ]
                     then echo
                          echo "error(s) found while compiling"
                          exit 100
                     else echo
                          echo "compiling successfull"
                  fi
                  

                  Into a *.o lib?

                  JonBJ 1 Reply Last reply
                  0
                  • LudoFRL LudoFR

                    @JonB Wow, really I want to thank you for your effort, this mean a lot seriously.

                    To be honest, this is why I think for the start because this lib is totally different from the one I use in C#.

                    So if I understand good I need to compile all files listed here :

                    #!/bin/bash
                    
                    bin_name=ethernet_sample
                    preprocessor_defines="-D USE_ETH"
                    
                    list_of_files="
                    source/ethernet_sample.c
                    
                    ../../delib-sources/delib/library/vc/deditec_timer.c
                    ../../delib-sources/delib/library/vc/deditec_tcp_io.c
                    ../../delib-sources/delib/library/vc/deditec_buff_utils.c
                    ../../delib-sources/delib/library/vc/deditec_string_utils.c
                    ../../delib-sources/delib/library/vc/deditec_convert_functions.c
                    ../../delib-sources/delib/library/embedded/deditec_debug_comfort.c
                    
                    ../../delib-sources/delib/delib_hdlmgr.c
                    ../../delib-sources/delib/delib_packet_statistic.c
                    ../../delib-sources/delib/delib_Dapi_di_do_ad_da_befehle.c
                    ../../delib-sources/delib/delib_set_get_error.c
                    ../../delib-sources/delib/delib_Dapi_register_commands.c
                    ../../delib-sources/delib/delib_open_close.c
                    ../../delib-sources/delib/delib_io_tcp.c
                    -g"
                    
                    echo now compiling $bin_name
                    gcc $preprocessor_defines -o $bin_name $list_of_files
                    
                    if [ $? != "0" ]
                       then echo
                            echo "error(s) found while compiling"
                            exit 100
                       else echo
                            echo "compiling successfull"
                    fi
                    

                    Into a *.o lib?

                    JonBJ Offline
                    JonBJ Offline
                    JonB
                    wrote on last edited by JonB
                    #13

                    @LudoFR said in undefined reference - Help first time external header library QT C++ [Linux]:

                    Wow, really I want to thank you for your effort, this mean a lot seriously.

                    That's good, because I'm expecting a beer ;-)

                    Into a *.o lib?

                    No. Compiling each of those files separately will produce a .o file for each of the .c source files. This example does not show any library (.so, or for that matter .a) being generated from them. I presume that is how it is intended to work, author does not want you to create a single library but rather compile them all and link all the .o files.

                    Assuming this is so, then I believe you will have to add all whatever necessary .c files (may not be all the ones in this example, might be others, I don't know) into your Qt project as source files, in addition to your own source file(s). Then when you build the project all the .o files will be created separately, and all must be included in the link line.

                    I'm afraid it's over to you to do whatever to get all those source files correctly added into the project in Creator/the .pro file. You will have to be careful the paths are right and their header (.h) files are found correctly.

                    P.S.
                    At this point have you considered dropping this third-party Borland stuff completely and using Qt's QTcpSocket to do whatever you want from TCP instead? But I'm not offering to change your own source code over from using Borland TCP to Qt's ;-)

                    LudoFRL 1 Reply Last reply
                    0
                    • JonBJ JonB

                      @LudoFR said in undefined reference - Help first time external header library QT C++ [Linux]:

                      Wow, really I want to thank you for your effort, this mean a lot seriously.

                      That's good, because I'm expecting a beer ;-)

                      Into a *.o lib?

                      No. Compiling each of those files separately will produce a .o file for each of the .c source files. This example does not show any library (.so, or for that matter .a) being generated from them. I presume that is how it is intended to work, author does not want you to create a single library but rather compile them all and link all the .o files.

                      Assuming this is so, then I believe you will have to add all whatever necessary .c files (may not be all the ones in this example, might be others, I don't know) into your Qt project as source files, in addition to your own source file(s). Then when you build the project all the .o files will be created separately, and all must be included in the link line.

                      I'm afraid it's over to you to do whatever to get all those source files correctly added into the project in Creator/the .pro file. You will have to be careful the paths are right and their header (.h) files are found correctly.

                      P.S.
                      At this point have you considered dropping this third-party Borland stuff completely and using Qt's QTcpSocket to do whatever you want from TCP instead? But I'm not offering to change your own source code over from using Borland TCP to Qt's ;-)

                      LudoFRL Offline
                      LudoFRL Offline
                      LudoFR
                      wrote on last edited by
                      #14

                      @JonB

                      Well not against offering you a beer, or two...(or more :-))

                      @JonB said in undefined reference - Help first time external header library QT C++ [Linux]:

                      At this point have you considered dropping this third-party Borland stuff completely and using Qt's QTcpSocket to do whatever you want from TCP instead? But I'm not offering to change your own source code over from using Borland TCP to Qt's ;-)

                      This APi is used for GPIO manipulation from an ethernet GPIO modules :
                      787d599f-c9e0-4a81-b147-61a7492b4eee-image.png

                      What you say seems really true, cause the documentation about the use with Visual studio c++ do not refer at any moment about any library, only cpp/h files. I will try to use this documentation and use into my *.pro file only the files used into Visual Studio.

                      https://www.deditec.de/media/pdf/manual_e_delib.pdf#page=26&zoom=auto,-329,815

                      I will made you a feedback of course

                      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