Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Qt Creator and other tools
  4. Qt Creator: Linker errors in shadow build only
Forum Updated to NodeBB v4.3 + New Features

Qt Creator: Linker errors in shadow build only

Scheduled Pinned Locked Moved Unsolved Qt Creator and other tools
13 Posts 5 Posters 1.1k 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.
  • R Offline
    R Offline
    richardjdare
    wrote on 12 Jul 2024, 16:26 last edited by
    #1

    Hi folks,
    I'm having a problem with a qmake project that won't build using shadow builds, but will build with shadow builds turned off.

    I'm using Qt Creator 13.0.2 and Desktop Qt 6.7.2 MSVC2019 64bit on Windows 10

    When I try a shadow build, it fails to link with the following errors:

    parser.obj : error LNK2005: ts_parser_new already defined in lib.obj
    parser.obj : error LNK2005: ts_parser_delete already defined in lib.obj
    parser.obj : error LNK2005: ts_parser_language already defined in lib.obj
    

    .. (and a bunch more for other functions in parser.obj)

    It works fine when I turn off shadow builds.

    I made a minimal test program that demonstrates the problem. Here is its .pro file:

    TREE_SITTER_SRC_ROOT = F:/projects/buildtest/src/3rdparty/tree-sitter/lib/src
    TREE_SITTER_PARSER_SRC_ROOT = F:/projects/buildtest/src/3rdparty/tree-sitter-commonlisp/src
    
    TEMPLATE = app
    TARGET = SLIDE
    QT += core gui widgets network svg
    
    CONFIG += c++14
    CONFIG += console
    CONFIG -= qml_debug
    
    SOURCES += \
        main.cpp \
        testmainwindow.cpp \
        $${TREE_SITTER_SRC_ROOT}/lib.c \
        $${TREE_SITTER_PARSER_SRC_ROOT}/parser.c
    
    RESOURCES += \
        slide.qrc
    
    HEADERS += \
        testmainwindow.h \
    
    #tree-sitter
    INCLUDEPATH += F:/projects/buildtest/src/3rdparty/tree-sitter/lib/src
    INCLUDEPATH += F:/projects/buildtest/src/3rdparty/tree-sitter/lib/include
    

    The program itself does nothing but open a QMainWindow.

    Tree-sitter is a C library, included as per the documentation. (https://tree-sitter.github.io/tree-sitter/using-parsers) I've been using it happily for a long time with this exact setup.

    My app worked fine until last week when my Qt install stopped being able to build anything, including empty new-project-wizard projects. I reinstalled Qt and Qt Creator and since then my app won't build unless I turn off shadow builds.

    I have a Linux machine running Qt Creator 13.0.0, and Qt 6.4.0 and the app (and the minimal test app) builds fine on that.

    I'd be grateful for any insights.

    C 1 Reply Last reply 13 Jul 2024, 16:14
    0
    • C Offline
      C Offline
      Christian Ehrlicher
      Lifetime Qt Champion
      wrote on 12 Jul 2024, 17:48 last edited by
      #2

      Lib.c already includes parser.c so the symbols are there twice. Remove parser.c

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

      1 Reply Last reply
      3
      • R Offline
        R Offline
        richardjdare
        wrote on 12 Jul 2024, 22:16 last edited by
        #3

        Thanks for your reply,

        I should probably explain a little more.
        lib.c is the tree-sitter 'library'.

        parser.c is separate. It's a specific parser generated by other software in the tree-sitter system for use with lib.c.
        In this case, it is a Common Lisp parser (from https://github.com/tree-sitter-grammars/tree-sitter-commonlisp)
        There are many other parsers available for parsing other languages.

        I implemented a basic example inside my test application:
        (These are now the contents of testmainwindow.cpp referenced in the .pro file in my original post)

        #include "testmainwindow.h"
        #include <tree_sitter/api.h>
        
        extern "C" { TSLanguage *tree_sitter_commonlisp(); }
        
        TestMainWindow::TestMainWindow(QWidget *parent)
            : QMainWindow{parent}
        {
            QString testStr = "(defun foo (x)\r\n  (dotimes (i x)\r\n    (format t \"hello, world ~a~%\")))";
            auto utf8Str = testStr.toUtf8().toStdString();
        
            TSParser *parser = ts_parser_new();
            ts_parser_set_language(parser, tree_sitter_commonlisp());
        
            TSTree *tree = ts_parser_parse_string(
                parser,
                nullptr,
                utf8Str.c_str(),
                static_cast<uint32_t>(utf8Str.length())
            );
        
            TSNode root_node = ts_tree_root_node(tree);
            QString s =  QString(ts_node_string(root_node));
            qDebug() << s;
        }
        

        The 'extern "C" TSLanguage *tree_sitter_commonlisp()' comes from parser.c, the other ts_* functions are from lib.c

        If I exclude parser.c and build "testmainwindow.cpp" I get "unresolved external symbol tree_sitter_commonlisp"
        If I exclude lib.c I get unresolved externals for the ts_* functions
        if I keep them both, I get "parser.obj : error LNK2005: ts_parser_new already defined in lib.obj" etc.

        If I keep them both, and turn off shadow build, the app works. It used to work for me in the past with shadow build. It still works on my Linux machine running an older Qt and Qt Creator, that's what I don't understand.

        1 Reply Last reply
        0
        • H Online
          H Online
          hskoglund
          wrote on 12 Jul 2024, 22:31 last edited by
          #4

          Perhaps verify that your Qt installation is kosher, you could try building a project from the examples directory included with Qt 6.7.2,

          1 Reply Last reply
          1
          • R Offline
            R Offline
            richardjdare
            wrote on 12 Jul 2024, 23:25 last edited by
            #5

            Thanks for your suggestion. I tried the Mandelbrot example. I ran CMake then tried to build and got the following error:
            ninja: error: build.ninja:184: multiple outputs aren't (yet?) supported by depslog; bring this up on the mailing list if it affects you
            (I admit I don't have much experience with CMake yet)

            Then I used the New Project wizard to create a qmake Qt Widgets Application. When I tried to build it I got the error:
            :-1: error: dependent '............\Qt\6.7.2\msvc2019_64\include\QtWidgets\QMainWindow' does not exist.

            I turned off shadow builds, and it built ok.

            So something is definitely wrong. I actually had similar errors last week, trying to create a small test app, which prompted me to reinstall Qt. Since there is still a problem it may be my system has some underlying issues. I will investigate my MSVC install too.

            Thank you both for taking time to help.

            1 Reply Last reply
            0
            • C Offline
              C Offline
              Christian Ehrlicher
              Lifetime Qt Champion
              wrote on 13 Jul 2024, 05:40 last edited by
              #6

              Look into lib.c and you will see that parser.c is included. The linker tells you the same... But feel free to ignore me and the linker.

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

              1 Reply Last reply
              0
              • R Offline
                R Offline
                richardjdare
                wrote on 13 Jul 2024, 13:42 last edited by
                #7

                @Christian-Ehrlicher If you read my earlier reply, you'll see that I did in fact try to build it without parser.c as you suggested. (and conversely, without lib.c, as an experiment)

                The 'extern "C" TSLanguage *tree_sitter_commonlisp()' comes from parser.c, the other ts_* functions are from lib.c

                If I exclude parser.c and build testmainwindow.cpp I get "unresolved external symbol tree_sitter_commonlisp"
                If I exclude lib.c I get unresolved externals for the ts_* functions
                if I keep them both, I get "parser.obj : error LNK2005: ts_parser_new already defined in lib.obj" etc.

                If I keep them both, and turn off shadow build, the app works.

                Can you tell me why the linker doesn't complain if I turn off shadow builds, or why I can build and run the project without error on my Linux machine? I've been using these libraries in this very way for many months without complaint from the linker.

                I believe I am using the library correctly, as described by these instructions (https://tree-sitter.github.io/tree-sitter/using-parsers#an-example-program)

                The evidence seems to suggest that my system is busted, since I can no longer build a even a basic app created by the project wizard.

                1 Reply Last reply
                0
                • R richardjdare
                  12 Jul 2024, 16:26

                  Hi folks,
                  I'm having a problem with a qmake project that won't build using shadow builds, but will build with shadow builds turned off.

                  I'm using Qt Creator 13.0.2 and Desktop Qt 6.7.2 MSVC2019 64bit on Windows 10

                  When I try a shadow build, it fails to link with the following errors:

                  parser.obj : error LNK2005: ts_parser_new already defined in lib.obj
                  parser.obj : error LNK2005: ts_parser_delete already defined in lib.obj
                  parser.obj : error LNK2005: ts_parser_language already defined in lib.obj
                  

                  .. (and a bunch more for other functions in parser.obj)

                  It works fine when I turn off shadow builds.

                  I made a minimal test program that demonstrates the problem. Here is its .pro file:

                  TREE_SITTER_SRC_ROOT = F:/projects/buildtest/src/3rdparty/tree-sitter/lib/src
                  TREE_SITTER_PARSER_SRC_ROOT = F:/projects/buildtest/src/3rdparty/tree-sitter-commonlisp/src
                  
                  TEMPLATE = app
                  TARGET = SLIDE
                  QT += core gui widgets network svg
                  
                  CONFIG += c++14
                  CONFIG += console
                  CONFIG -= qml_debug
                  
                  SOURCES += \
                      main.cpp \
                      testmainwindow.cpp \
                      $${TREE_SITTER_SRC_ROOT}/lib.c \
                      $${TREE_SITTER_PARSER_SRC_ROOT}/parser.c
                  
                  RESOURCES += \
                      slide.qrc
                  
                  HEADERS += \
                      testmainwindow.h \
                  
                  #tree-sitter
                  INCLUDEPATH += F:/projects/buildtest/src/3rdparty/tree-sitter/lib/src
                  INCLUDEPATH += F:/projects/buildtest/src/3rdparty/tree-sitter/lib/include
                  

                  The program itself does nothing but open a QMainWindow.

                  Tree-sitter is a C library, included as per the documentation. (https://tree-sitter.github.io/tree-sitter/using-parsers) I've been using it happily for a long time with this exact setup.

                  My app worked fine until last week when my Qt install stopped being able to build anything, including empty new-project-wizard projects. I reinstalled Qt and Qt Creator and since then my app won't build unless I turn off shadow builds.

                  I have a Linux machine running Qt Creator 13.0.0, and Qt 6.4.0 and the app (and the minimal test app) builds fine on that.

                  I'd be grateful for any insights.

                  C Offline
                  C Offline
                  Christian Ehrlicher
                  Lifetime Qt Champion
                  wrote on 13 Jul 2024, 16:14 last edited by
                  #8

                  @richardjdare said in Qt Creator: Linker errors in shadow build only:

                  $${TREE_SITTER_PARSER_SRC_ROOT}/parser.c

                  The env var points to the wrong directory and therefore the wrong parser.c is used. Using the same file name twice in a project is bad design.

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

                  1 Reply Last reply
                  0
                  • R Offline
                    R Offline
                    richardjdare
                    wrote on 13 Jul 2024, 16:59 last edited by
                    #9

                    I'm sorry mate I appreciate your help, but I don't understand what you are suggesting. Lets look at the two variables:

                    TREE_SITTER_SRC_ROOT = F:/projects/buildtest/src/3rdparty/tree-sitter/lib/src
                    TREE_SITTER_PARSER_SRC_ROOT = F:/projects/buildtest/src/3rdparty/tree-sitter-commonlisp/src
                    

                    they are used like so:

                    SOURCES += /
                      $${TREE_SITTER_SRC_ROOT}/lib.c \
                      $${TREE_SITTER_PARSER_SRC_ROOT}/parser.c
                    

                    Lets print these out from the .pro file using message():

                    message($${TREE_SITTER_SRC_ROOT}/lib.c)
                    message($${TREE_SITTER_PARSER_SRC_ROOT}/parser.c)
                    

                    which gives us:

                    Project MESSAGE: F:/projects/buildtest/src/3rdparty/tree-sitter/lib/src/lib.c
                    Project MESSAGE: F:/projects/buildtest/src/3rdparty/tree-sitter-commonlisp/src/parser.c
                    

                    These are correct. I want lib.c from tree-sitter. and parser.c from tree-sitter-commonlisp.

                    If this is indeed the problem, then why does the app build ok when I turn off shadow builds? Shouldn't I get the same compiler and linker errors whether I use shadow build or not? Why does it work fine on my Linux machine?

                    1 Reply Last reply
                    0
                    • R Offline
                      R Offline
                      richardjdare
                      wrote on 18 Jul 2024, 17:22 last edited by
                      #10

                      I've been investigating my system. I just want to add that my test program (and my larger app) works fine with shadow build if I change the kit to Desktop Qt 6.7.2 MinGW 64bit.

                      I also reimplemented my test app in Visual Studio 2022. not using Qt, but linking to the tree-sitter code in as similar a way as possible. (to see how msvc handled it in that environment) It worked fine.

                      1 Reply Last reply
                      0
                      • N Offline
                        N Offline
                        neit95
                        wrote on 25 Nov 2024, 01:59 last edited by
                        #11

                        Hi, I have a similar problem:

                        1. Create project with QWindow:
                        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 \
                            MainWindow.cpp
                        
                        HEADERS += \
                            MainWindow.hpp
                        
                        FORMS += \
                            MainWindow.ui
                        
                        # Default rules for deployment.
                        qnx: target.path = /tmp/$${TARGET}/bin
                        else: unix:!android: target.path = /opt/$${TARGET}/bin
                        !isEmpty(target.path): INSTALLS += target
                        

                        Build dirrectory: C:\my\<project_dir>\build\debug
                        2. Build this.

                        I get the following error:

                        C:\Qt\Tools\QtCreator\bin\jom\jom.exe -f Makefile.Debug
                        Error: dependent '..\..\..\..\Qt\6.7.2\msvc2019_64\include\QtWidgets\QMainWindow' does not exist.
                        jom: C:\my\Repeater_2\build\Makefile [debug] Error 2
                        

                        What I found out:
                        Makefile ( C:\my\<project_dir>\build\debug\Makefile.Debug) has such lines:

                        debug\moc_MainWindow.cpp: ..\..\MainWindow.hpp \
                        		..\..\..\..\..\..\Qt\6.7.2\msvc2019_64\include\QtWidgets\QMainWindow \
                        		..\..\..\..\..\..\Qt\6.7.2\msvc2019_64\include\QtWidgets\qmainwindow.h \
                        		..\..\..\..\..\..\Qt\6.7.2\msvc2019_64\include\QtWidgets\qtwidgetsglobal.h \
                        		..\..\..\..\..\..\Qt\6.7.2\msvc2019_64\include\QtGui\qtguiglobal.h \
                        ...
                        

                        But build catalog is C:\my\<project_dir>\build\debug\Makefile.Debug. It turns out that the path to Qt includes is generated incorrectly.
                        If build dirrectory change to C:\my\<project_dir> build will be correct.

                        jsulmJ 1 Reply Last reply 25 Nov 2024, 08:37
                        0
                        • N neit95
                          25 Nov 2024, 01:59

                          Hi, I have a similar problem:

                          1. Create project with QWindow:
                          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 \
                              MainWindow.cpp
                          
                          HEADERS += \
                              MainWindow.hpp
                          
                          FORMS += \
                              MainWindow.ui
                          
                          # Default rules for deployment.
                          qnx: target.path = /tmp/$${TARGET}/bin
                          else: unix:!android: target.path = /opt/$${TARGET}/bin
                          !isEmpty(target.path): INSTALLS += target
                          

                          Build dirrectory: C:\my\<project_dir>\build\debug
                          2. Build this.

                          I get the following error:

                          C:\Qt\Tools\QtCreator\bin\jom\jom.exe -f Makefile.Debug
                          Error: dependent '..\..\..\..\Qt\6.7.2\msvc2019_64\include\QtWidgets\QMainWindow' does not exist.
                          jom: C:\my\Repeater_2\build\Makefile [debug] Error 2
                          

                          What I found out:
                          Makefile ( C:\my\<project_dir>\build\debug\Makefile.Debug) has such lines:

                          debug\moc_MainWindow.cpp: ..\..\MainWindow.hpp \
                          		..\..\..\..\..\..\Qt\6.7.2\msvc2019_64\include\QtWidgets\QMainWindow \
                          		..\..\..\..\..\..\Qt\6.7.2\msvc2019_64\include\QtWidgets\qmainwindow.h \
                          		..\..\..\..\..\..\Qt\6.7.2\msvc2019_64\include\QtWidgets\qtwidgetsglobal.h \
                          		..\..\..\..\..\..\Qt\6.7.2\msvc2019_64\include\QtGui\qtguiglobal.h \
                          ...
                          

                          But build catalog is C:\my\<project_dir>\build\debug\Makefile.Debug. It turns out that the path to Qt includes is generated incorrectly.
                          If build dirrectory change to C:\my\<project_dir> build will be correct.

                          jsulmJ Offline
                          jsulmJ Offline
                          jsulm
                          Lifetime Qt Champion
                          wrote on 25 Nov 2024, 08:37 last edited by
                          #12

                          @neit95 How did you install Qt?

                          https://forum.qt.io/topic/113070/qt-code-of-conduct

                          1 Reply Last reply
                          0
                          • N Offline
                            N Offline
                            neit95
                            wrote on 25 Nov 2024, 13:06 last edited by neit95
                            #13

                            @jsulm I used Qt Installer. It is installed in C:\Qt

                            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