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. Statically Link 3rd Party Library Built with CMake into Qt 5.12.11 Project Built with QMake in Qt Creator
Forum Updated to NodeBB v4.3 + New Features

Statically Link 3rd Party Library Built with CMake into Qt 5.12.11 Project Built with QMake in Qt Creator

Scheduled Pinned Locked Moved Solved General and Desktop
37 Posts 2 Posters 7.2k Views 3 Watching
  • 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
    Crag_Hack
    wrote on last edited by
    #1

    Hi I am trying to statically link the cutelyst simplemail library into my Qt project. I've been scouring the web or several hours now without a definitive soution. Cutelyst simplemail is built with CMake while my project is built with QMake and Qt 5.12.11 in Qt Creator. I have gotten the dynamic linking to work but am having trouble with static linking. Here are my questions:

    1. How do I build the cutelyst simpemail project statically using CMake?
    2. After building it statically how do I add it to my Qt project? Is it as simple as a LIBS+= or right-clicking on the project in Qt Creator and going to add library and following the wizard?
    3. Do I need to rebuild Qt static and integrate the cutelyst simplemail library into it?
    4. Are there any other approaches or information I've missed?

    A minor detail that might complicate things is that cutelyst simplemail depends on the Qt5Core and Qt5Network libraries.

    Of course this assumes all of this is possible... Thanks!

    SGaistS 1 Reply Last reply
    0
    • C Crag_Hack

      @SGaist I can be a little flaky sometimes... was using a different computer to compile the library than that which I was compiling my program. DUH! I'll post an answer with everything I did later. Thanks SGaist!

      C Offline
      C Offline
      Crag_Hack
      wrote on last edited by Crag_Hack
      #37

      Here is what I had to do to compile the SimpleMail library statically:

      1. Load SimpleMail into Qt Creator by opening CMakeLists.txt from the SimpleMail directory
      2. In Qt Creator set the BUILD_SHARED_LIBS option to OFF in Project settings for SimpleMail (see post 6)
      3. Remove SHARED from the end of the add_library(SimpleMail2Qt${QT_VERSION_MAJOR} command in CMakeLists.txt in the src subdir (it will then default to SHARED or STATIC based on the BUILD_SHARED_LIBS setting)
      4. Add the following commands to the end of CMakeLists.txt in the src subdir (at the end so they override any previous compiler flags set)
        set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
        set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")

        These tell CMake to use the static version of the MSVC run-time library.
      5. Turn off demo compilation with option(BUILD_DEMOS "Build the demos" OFF)
      6. SimpleMail was not configured to support static build by default so I had to change some code in smtpexports.h to change functions from being linked for DLL usage to static usage:
        #define SMTP_EXPORT
        /#if defined(SimpleMail2Qt5_EXPORTS)
        #define SMTP_EXPORT Q_DECL_EXPORT
        #else
        #define SMTP_EXPORT Q_DECL_IMPORT
        #endif
        /

        For any library that is not built for static builds by default like SimpleMail you have to do the same. Q_DECL_EXPORT and Q_DECL_IMPORT are Qt macros for __declspec(dllexport) and __declspec(dllimport) respectively so if your library uses those you'll have to do the same for those guys in the library. By doing a #define for the macro without a value it will be empty and therefore avoid adding those __declspec guys to the library.
      7. Make sure to build the library using a static build of Qt.
      1 Reply Last reply
      0
      • C Crag_Hack

        Hi I am trying to statically link the cutelyst simplemail library into my Qt project. I've been scouring the web or several hours now without a definitive soution. Cutelyst simplemail is built with CMake while my project is built with QMake and Qt 5.12.11 in Qt Creator. I have gotten the dynamic linking to work but am having trouble with static linking. Here are my questions:

        1. How do I build the cutelyst simpemail project statically using CMake?
        2. After building it statically how do I add it to my Qt project? Is it as simple as a LIBS+= or right-clicking on the project in Qt Creator and going to add library and following the wizard?
        3. Do I need to rebuild Qt static and integrate the cutelyst simplemail library into it?
        4. Are there any other approaches or information I've missed?

        A minor detail that might complicate things is that cutelyst simplemail depends on the Qt5Core and Qt5Network libraries.

        Of course this assumes all of this is possible... Thanks!

        SGaistS Offline
        SGaistS Offline
        SGaist
        Lifetime Qt Champion
        wrote on last edited by
        #2

        Hi,

        1. Check this part of the CMake documentation. Short version: set the BUILD_SHARED_LIBS option to false.
        2. Yes
        3. No
        4. I don't think so

        Interested in AI ? www.idiap.ch
        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

        C 1 Reply Last reply
        0
        • SGaistS SGaist

          Hi,

          1. Check this part of the CMake documentation. Short version: set the BUILD_SHARED_LIBS option to false.
          2. Yes
          3. No
          4. I don't think so
          C Offline
          C Offline
          Crag_Hack
          wrote on last edited by Crag_Hack
          #3

          @SGaist Thanks I've tried compiling in Qt Creator with BUILD_SHARED_LIBS set to off in CMakeLists.txt, in Qt Creator with BUILD_SHARED_LIBS set to off via project settings, and also compiling via the command line using CMake from MSVS then building the project in MSVS.

          I get the same results no matter what, my program asks for SimpleMail2Qt5.dll, Qt5Core, and Qt5Network.dll. A static build of cuetlyst simplemail should negate the requirement for bundling those dlls right? Am I missing/overlooking something simple here?

          SGaistS 1 Reply Last reply
          0
          • C Crag_Hack

            @SGaist Thanks I've tried compiling in Qt Creator with BUILD_SHARED_LIBS set to off in CMakeLists.txt, in Qt Creator with BUILD_SHARED_LIBS set to off via project settings, and also compiling via the command line using CMake from MSVS then building the project in MSVS.

            I get the same results no matter what, my program asks for SimpleMail2Qt5.dll, Qt5Core, and Qt5Network.dll. A static build of cuetlyst simplemail should negate the requirement for bundling those dlls right? Am I missing/overlooking something simple here?

            SGaistS Offline
            SGaistS Offline
            SGaist
            Lifetime Qt Champion
            wrote on last edited by
            #4

            @Crag_Hack check whether you have the dynamic and static libraries in the same folder, if so, move the shared one somewhere else otherwise the linker will prefer them depending on how the arguments were feed.

            As for QtCore and QtNetwork, that's normal. Unless you use only static libraries, you will have such dynamic dependencies.

            The only way to have "no dependencies at all" is to build absolutely everything statically, including setting the VS runtime to static, which means that you will have to rebuild everything when they release a new runtime (think of security updates). This also implies additional requirements with regard to the license your dependencies are using (for example LGPL for Qt). That said, since you are already using a dynamic version of Qt, I don't really see the benefit of using a static version of SimpleMail2 beside removing one file to deploy.

            Interested in AI ? www.idiap.ch
            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

            C 1 Reply Last reply
            0
            • SGaistS SGaist

              @Crag_Hack check whether you have the dynamic and static libraries in the same folder, if so, move the shared one somewhere else otherwise the linker will prefer them depending on how the arguments were feed.

              As for QtCore and QtNetwork, that's normal. Unless you use only static libraries, you will have such dynamic dependencies.

              The only way to have "no dependencies at all" is to build absolutely everything statically, including setting the VS runtime to static, which means that you will have to rebuild everything when they release a new runtime (think of security updates). This also implies additional requirements with regard to the license your dependencies are using (for example LGPL for Qt). That said, since you are already using a dynamic version of Qt, I don't really see the benefit of using a static version of SimpleMail2 beside removing one file to deploy.

              C Offline
              C Offline
              Crag_Hack
              wrote on last edited by Crag_Hack
              #5

              @SGaist I had the dll and the lib for Simple Mail in the same directory so I renamed the dll and still have the same DLL dependency after rebuilding the program. lib files are always static right? I could try rebuilding the libraries but I'm pretty sure I did it right the first time.

              Also re

              including setting the VS runtime to static

              you just mean build Qt static right?

              C 1 Reply Last reply
              0
              • C Crag_Hack

                @SGaist I had the dll and the lib for Simple Mail in the same directory so I renamed the dll and still have the same DLL dependency after rebuilding the program. lib files are always static right? I could try rebuilding the libraries but I'm pretty sure I did it right the first time.

                Also re

                including setting the VS runtime to static

                you just mean build Qt static right?

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

                @SGaist I tried rebuilding the simple mail libraries with no luck. Here are a couple screenshots of the shared lib settings:

                3.png 5.png

                C 1 Reply Last reply
                0
                • C Crag_Hack

                  @SGaist I tried rebuilding the simple mail libraries with no luck. Here are a couple screenshots of the shared lib settings:

                  3.png 5.png

                  C Offline
                  C Offline
                  Crag_Hack
                  wrote on last edited by Crag_Hack
                  #7

                  @Crag_Hack And here's the library build directory

                  4.png

                  SGaistS 1 Reply Last reply
                  0
                  • C Crag_Hack

                    @Crag_Hack And here's the library build directory

                    4.png

                    SGaistS Offline
                    SGaistS Offline
                    SGaist
                    Lifetime Qt Champion
                    wrote on last edited by
                    #8

                    A .lib file can either be an import or a static library. Seeing the size of yours, it's clearly the former.

                    Interested in AI ? www.idiap.ch
                    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                    C 1 Reply Last reply
                    0
                    • SGaistS SGaist

                      A .lib file can either be an import or a static library. Seeing the size of yours, it's clearly the former.

                      C Offline
                      C Offline
                      Crag_Hack
                      wrote on last edited by Crag_Hack
                      #9

                      @SGaist Thanks, any way to force build of a static library instead of import library? couldn't find anything on google...

                      SGaistS 1 Reply Last reply
                      0
                      • C Crag_Hack

                        @SGaist Thanks, any way to force build of a static library instead of import library? couldn't find anything on google...

                        SGaistS Offline
                        SGaistS Offline
                        SGaist
                        Lifetime Qt Champion
                        wrote on last edited by
                        #10

                        Clean the content of the build folder and rebuild the project ensuring that BUILD_SHARED_LIBS is set to off.

                        Interested in AI ? www.idiap.ch
                        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                        C 1 Reply Last reply
                        0
                        • SGaistS SGaist

                          Clean the content of the build folder and rebuild the project ensuring that BUILD_SHARED_LIBS is set to off.

                          C Offline
                          C Offline
                          Crag_Hack
                          wrote on last edited by Crag_Hack
                          #11

                          @SGaist I think I found the problem after some head smashing... in the CMakeLists.txt for the Simple Mail library it has:

                          add_library(SimpleMail2Qt${QT_VERSION_MAJOR} SHARED
                              ${simplemailqt_SRC}
                              ${simplemailqt_HEADERS}
                              ${simplemailqt_HEADERS_PRIVATE}
                          )
                          

                          The ${simplemailqt_***} variables are just lists of source files.

                          I changed to STATIC instead of shared but then get a bunch of inconsistent dll linkage warnings and three definition of dllimport static data member not allowed errors (see screenshot below).

                          Does that mean the developer designed the library to be shared only? Would it take a herculean effort to convert it to static? Thanks again!

                          5.png

                          C 1 Reply Last reply
                          0
                          • C Crag_Hack

                            @SGaist I think I found the problem after some head smashing... in the CMakeLists.txt for the Simple Mail library it has:

                            add_library(SimpleMail2Qt${QT_VERSION_MAJOR} SHARED
                                ${simplemailqt_SRC}
                                ${simplemailqt_HEADERS}
                                ${simplemailqt_HEADERS_PRIVATE}
                            )
                            

                            The ${simplemailqt_***} variables are just lists of source files.

                            I changed to STATIC instead of shared but then get a bunch of inconsistent dll linkage warnings and three definition of dllimport static data member not allowed errors (see screenshot below).

                            Does that mean the developer designed the library to be shared only? Would it take a herculean effort to convert it to static? Thanks again!

                            5.png

                            C Offline
                            C Offline
                            Crag_Hack
                            wrote on last edited by
                            #12

                            @SGaist Got any input? A little might go a long way, thanks!

                            SGaistS 1 Reply Last reply
                            0
                            • C Crag_Hack

                              @SGaist Got any input? A little might go a long way, thanks!

                              SGaistS Offline
                              SGaistS Offline
                              SGaist
                              Lifetime Qt Champion
                              wrote on last edited by
                              #13

                              Sorry I lost track of this thread. Can you post the exact link of the sources of that library (just to be sure we are looking at the same thing).

                              Interested in AI ? www.idiap.ch
                              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                              C 1 Reply Last reply
                              0
                              • SGaistS SGaist

                                Sorry I lost track of this thread. Can you post the exact link of the sources of that library (just to be sure we are looking at the same thing).

                                C Offline
                                C Offline
                                Crag_Hack
                                wrote on last edited by
                                #14

                                @SGaist
                                Here 'tis. I'm looking at the CMakeLists.txt in the src directory which is the location of the library code.

                                SGaistS 1 Reply Last reply
                                0
                                • C Crag_Hack

                                  @SGaist
                                  Here 'tis. I'm looking at the CMakeLists.txt in the src directory which is the location of the library code.

                                  SGaistS Offline
                                  SGaistS Offline
                                  SGaist
                                  Lifetime Qt Champion
                                  wrote on last edited by
                                  #15

                                  I found the issue, there's a glitch in the src CMakeLists.txt, they have hard coded the library build as shared. Just removed that from the add_library line, configure the build to be static and you will have a static build of it.

                                  Interested in AI ? www.idiap.ch
                                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                  C 1 Reply Last reply
                                  1
                                  • SGaistS SGaist

                                    I found the issue, there's a glitch in the src CMakeLists.txt, they have hard coded the library build as shared. Just removed that from the add_library line, configure the build to be static and you will have a static build of it.

                                    C Offline
                                    C Offline
                                    Crag_Hack
                                    wrote on last edited by
                                    #16

                                    @SGaist Thanks, SGaist, I found the same issue, see three posts ago. I just now tried leaving both STATIC and SHARED out of add_library and get the same compile errors/warnings as using STATIC with add_library.

                                    I have the same question as before... Does this mean the developer designed the library to be shared only? Would it take a herculean effort to convert it to static? Thanks again!

                                    SGaistS 1 Reply Last reply
                                    0
                                    • C Crag_Hack

                                      @SGaist Thanks, SGaist, I found the same issue, see three posts ago. I just now tried leaving both STATIC and SHARED out of add_library and get the same compile errors/warnings as using STATIC with add_library.

                                      I have the same question as before... Does this mean the developer designed the library to be shared only? Would it take a herculean effort to convert it to static? Thanks again!

                                      SGaistS Offline
                                      SGaistS Offline
                                      SGaist
                                      Lifetime Qt Champion
                                      wrote on last edited by
                                      #17

                                      Do you mean you can't get a static build of the library ?

                                      Interested in AI ? www.idiap.ch
                                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                      C 1 Reply Last reply
                                      0
                                      • SGaistS SGaist

                                        Do you mean you can't get a static build of the library ?

                                        C Offline
                                        C Offline
                                        Crag_Hack
                                        wrote on last edited by
                                        #18

                                        @SGaist These are the errors/warnings I get when I try to build the library without the SHARED option passed to add_library:

                                        alt text

                                        SGaistS 1 Reply Last reply
                                        0
                                        • C Crag_Hack

                                          @SGaist These are the errors/warnings I get when I try to build the library without the SHARED option passed to add_library:

                                          alt text

                                          SGaistS Offline
                                          SGaistS Offline
                                          SGaist
                                          Lifetime Qt Champion
                                          wrote on last edited by
                                          #19

                                          With BUILD_SHARED_LIBS set to OFF ?

                                          Interested in AI ? www.idiap.ch
                                          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                          C 1 Reply Last reply
                                          0
                                          • SGaistS SGaist

                                            With BUILD_SHARED_LIBS set to OFF ?

                                            C Offline
                                            C Offline
                                            Crag_Hack
                                            wrote on last edited by
                                            #20

                                            @SGaist Yep that's correct.

                                            C 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