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. Using DLL in Qt project

Using DLL in Qt project

Scheduled Pinned Locked Moved Solved General and Desktop
dll
7 Posts 4 Posters 7.3k 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.
  • Joel BodenmannJ Offline
    Joel BodenmannJ Offline
    Joel Bodenmann
    wrote on last edited by Joel Bodenmann
    #1

    I am trying to use TinyCC (http://tinycc.org) in one of my projects. I managed to compile their example to use the libtcc to compile a C program inside a C program and it runs just fine. For that I am using gcc (I am on Windows and I use MinGW):

    gcc examples/libtcc_test.c -Llib -Ilibtcc libtcc.dll
    

    Now I created a new Qt console project and tried to do the same. However, I couldn't even get past the compile stage.
    I added the headers but I keep getting undefined reference to 'tcc_new()' for all those tcc_*() functions I have to call that are part of the library. I get these errors in the example project when I don't pass libtcc.dll to the gcc command. Therefore, I assume that the MinGW compiler I am using in QtCreator lacks that DLL too and therefore can't link. I stumbled across this tutorial that explains how to use a DLL in a Qt project: https://www.youtube.com/watch?v=9JTooLxhmC0
    At 05:00 you can see that he simply adds the DLL to the LIBS variable. I tried to do the same but I then I can't compile because I get the following error:

    C:\Users\joel.bodenmann\Documents\junk\TccTest\libtcc.dll:-1: error: file not recognized: File format not recognized
    

    Apparently it tries to compile that DLL file. However, in the linked tutorial that works just fine.
    Also, the TinyCC package contains some *.def files. Do I have to use them? I didn't have to use them in the manual example listed above.

    Can somebody tell me what I need to do to use a DLL in a Qt project? Google doesn't bring up many helpful things. After all it's working in that tutorial so I expect this to be some minor issue.

    Note: In the non-Qt example the compiler needs the *.a file and the *.dll file passed as the last argument. I don't quite understand why. I thought that the *.a file is simply a static library for GCC. Why does it need the DLL then?

    Industrial process automation software: https://simulton.com
    Embedded Graphics & GUI library: https://ugfx.io

    1 Reply Last reply
    0
    • A Offline
      A Offline
      alex_malyu
      wrote on last edited by alex_malyu
      #2

      You do not link against dll. DLL contains code loaded at runtime.
      But linker needs to find a declaration of function to make a call.

      Static libs ( normally *.lib) on Windows contain both: declaration and executable code.
      If you build dll normally *.lib file is also produced, but such file contains only declaration.
      So you link against name.lib file, but provide only name.dll file to user.

      I am not sure if GCC use a extension instead of lib.

      Joel BodenmannJ 1 Reply Last reply
      0
      • A alex_malyu

        You do not link against dll. DLL contains code loaded at runtime.
        But linker needs to find a declaration of function to make a call.

        Static libs ( normally *.lib) on Windows contain both: declaration and executable code.
        If you build dll normally *.lib file is also produced, but such file contains only declaration.
        So you link against name.lib file, but provide only name.dll file to user.

        I am not sure if GCC use a extension instead of lib.

        Joel BodenmannJ Offline
        Joel BodenmannJ Offline
        Joel Bodenmann
        wrote on last edited by
        #3

        @alex_malyu Thank you for your reply!

        Well, that is how I understood things too. But I really started questioning my knowledge once I saw that video I linked. After all he gets the very same errors that I get - then he adds the *.dll to the LIBS variable in the *.pro file and his problem is gone.

        Regarding the *.lib file: All the TCC download (for windows) comes with is one *.dll file, one *.a file and a bunch of *.def files. I have never seen *.def files before. The content looks like this:

        LIBRARY libtcc.dll
        
        EXPORTS
        pstrcat
        pstrcpy
        pstrncpy
        tcc_add_file
        tcc_add_include_path
        tcc_add_library
        tcc_add_library_path
        tcc_add_symbol
        tcc_add_sysinclude_path
        tcc_basename
        tcc_compile_string
        tcc_define_symbol
        tcc_delete
        tcc_error
        tcc_error_noabort
        tcc_fileextension
        tcc_free
        tcc_get_symbol
        tcc_malloc
        tcc_mallocz
        tcc_memstats
        tcc_new
        tcc_output_file
        tcc_parse_args
        tcc_print_stats
        tcc_realloc
        tcc_relocate
        tcc_run
        tcc_set_error_func
        tcc_set_lib_path
        tcc_set_options
        tcc_set_output_type
        tcc_strdup
        tcc_undefine_symbol
        tcc_warning
        

        Now, all those functions listed in that file is what I need. Can I generate a *.lib file from that or somehow directly use it?

        Industrial process automation software: https://simulton.com
        Embedded Graphics & GUI library: https://ugfx.io

        kshegunovK 1 Reply Last reply
        0
        • A Offline
          A Offline
          alex_malyu
          wrote on last edited by alex_malyu
          #4

          I am not sure why it work for him,
          but proper way is

          unix:LIBS += -L/usr/local/lib -lmath
          win32:LIBS += c:/mylibs/math.lib

          Again GCC may give it .a extension. If I were you I would try to link against it and made sure appropriate dll is located at the same folder as your executable when you are going to execute it.
          But last supposed not to affect your linking. dll file does not have information linker needs to link against it.

          1 Reply Last reply
          0
          • Joel BodenmannJ Joel Bodenmann

            @alex_malyu Thank you for your reply!

            Well, that is how I understood things too. But I really started questioning my knowledge once I saw that video I linked. After all he gets the very same errors that I get - then he adds the *.dll to the LIBS variable in the *.pro file and his problem is gone.

            Regarding the *.lib file: All the TCC download (for windows) comes with is one *.dll file, one *.a file and a bunch of *.def files. I have never seen *.def files before. The content looks like this:

            LIBRARY libtcc.dll
            
            EXPORTS
            pstrcat
            pstrcpy
            pstrncpy
            tcc_add_file
            tcc_add_include_path
            tcc_add_library
            tcc_add_library_path
            tcc_add_symbol
            tcc_add_sysinclude_path
            tcc_basename
            tcc_compile_string
            tcc_define_symbol
            tcc_delete
            tcc_error
            tcc_error_noabort
            tcc_fileextension
            tcc_free
            tcc_get_symbol
            tcc_malloc
            tcc_mallocz
            tcc_memstats
            tcc_new
            tcc_output_file
            tcc_parse_args
            tcc_print_stats
            tcc_realloc
            tcc_relocate
            tcc_run
            tcc_set_error_func
            tcc_set_lib_path
            tcc_set_options
            tcc_set_output_type
            tcc_strdup
            tcc_undefine_symbol
            tcc_warning
            

            Now, all those functions listed in that file is what I need. Can I generate a *.lib file from that or somehow directly use it?

            kshegunovK Offline
            kshegunovK Offline
            kshegunov
            Moderators
            wrote on last edited by
            #5

            @Joel-Bodenmann
            Hello,
            A .def file contains the names of the exported symbols from the library. It's pretty much a legacy format to specify which symbols are exported, or at least I've not known anyone using it actively for years. Still, from time to time you're going to stumble upon it. You can create, with the proper tool (only the last step is relevant to your case, since you have the .def), a .lib file that you can use to link with.
            After you've obtained the library file, link in the usual manner (in the project file):

            LIBS += -Lc:/Path/to/lib/file -lnameoflibfile
            

            Bear in mind that the name is simply the name of the library stripped of prefixes and suffixes, so if you want to link against libtcc.dll using libtcc.lib you just provide -ltcc to the link line.

            Kind regards.

            Read and abide by the Qt Code of Conduct

            Joel BodenmannJ 1 Reply Last reply
            1
            • A Offline
              A Offline
              asanka424
              wrote on last edited by
              #6

              Since you are using MinGW you don't have to bother about lib or def files.

              LIBS += -L<path> -ltcc

              This should do the work. Make sure you use Qt built using g same MinGW version

              1 Reply Last reply
              1
              • kshegunovK kshegunov

                @Joel-Bodenmann
                Hello,
                A .def file contains the names of the exported symbols from the library. It's pretty much a legacy format to specify which symbols are exported, or at least I've not known anyone using it actively for years. Still, from time to time you're going to stumble upon it. You can create, with the proper tool (only the last step is relevant to your case, since you have the .def), a .lib file that you can use to link with.
                After you've obtained the library file, link in the usual manner (in the project file):

                LIBS += -Lc:/Path/to/lib/file -lnameoflibfile
                

                Bear in mind that the name is simply the name of the library stripped of prefixes and suffixes, so if you want to link against libtcc.dll using libtcc.lib you just provide -ltcc to the link line.

                Kind regards.

                Joel BodenmannJ Offline
                Joel BodenmannJ Offline
                Joel Bodenmann
                wrote on last edited by
                #7

                @kshegunov Thank you very much for your reply!
                That actually worked out.

                @asanka424 Thank you for your suggestion. When I started trying to get this working that was the first thing I tried and I didn't succeed, sadly. However, I started a new project completely from scratch and now it works just fine using the method your described.

                Thank you for your help guys, highly appreciated!

                Industrial process automation software: https://simulton.com
                Embedded Graphics & GUI library: https://ugfx.io

                1 Reply Last reply
                0

                • Login

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