Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt
  • Unsolved
Collapse
qtws26_logo

The Qt Event of the Year: Qt World Summit 2026

Save Your Spot >
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. moc file not found
Qt 6.12 LTS is out! See what's new in the release blog

moc file not found

Scheduled Pinned Locked Moved Unsolved General and Desktop
17 Posts 5 Posters 8.1k Views 2 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.
  • Christian EhrlicherC Christian Ehrlicher

    Please show your CMakeLists.txt

    rpieketR Offline
    rpieketR Offline
    rpieket
    wrote on last edited by
    #3

    @Christian-Ehrlicher Thanks. I don't see that file. I'm using qmake. There is a generated makefile that is too large to attach.

    jsulmJ 1 Reply Last reply
    0
    • rpieketR rpieket

      @Christian-Ehrlicher Thanks. I don't see that file. I'm using qmake. There is a generated makefile that is too large to attach.

      jsulmJ Offline
      jsulmJ Offline
      jsulm
      Lifetime Qt Champion
      wrote on last edited by
      #4

      @rpieket said in moc file not found:

      I'm using qmake

      Then you can show the pro file

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

      rpieketR 1 Reply Last reply
      0
      • jsulmJ jsulm

        @rpieket said in moc file not found:

        I'm using qmake

        Then you can show the pro file

        rpieketR Offline
        rpieketR Offline
        rpieket
        wrote on last edited by
        #5

        @jsulm Here is the pro file:

        QT = core testlib
        
        CONFIG += c++17 cmdline
        
        # 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 += \
            tests.cpp
        
        # Default rules for deployment.
        qnx: target.path = /tmp/$${TARGET}/bin
        else: unix:!android: target.path = /opt/$${TARGET}/bin
        !isEmpty(target.path): INSTALLS += target
        
        
        Christian EhrlicherC 1 Reply Last reply
        0
        • rpieketR rpieket

          @jsulm Here is the pro file:

          QT = core testlib
          
          CONFIG += c++17 cmdline
          
          # 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 += \
              tests.cpp
          
          # Default rules for deployment.
          qnx: target.path = /tmp/$${TARGET}/bin
          else: unix:!android: target.path = /opt/$${TARGET}/bin
          !isEmpty(target.path): INSTALLS += target
          
          
          Christian EhrlicherC Offline
          Christian EhrlicherC Offline
          Christian Ehrlicher
          Lifetime Qt Champion
          wrote on last edited by
          #6

          Why do you include testqstring.moc when your source file is tests.cpp?

          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
          • Christian EhrlicherC Christian Ehrlicher

            Why do you include testqstring.moc when your source file is tests.cpp?

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

            @Christian-Ehrlicher Beat me to it.

            The qmake "magic" that generates a Makefile rule for moc when it sees this style of include requires that it matches on the base name of the source file concerned.

            rpieketR 1 Reply Last reply
            0
            • C ChrisW67

              @Christian-Ehrlicher Beat me to it.

              The qmake "magic" that generates a Makefile rule for moc when it sees this style of include requires that it matches on the base name of the source file concerned.

              rpieketR Offline
              rpieketR Offline
              rpieket
              wrote on last edited by
              #8

              The mismatch is due to my attempt to simplify before posting. This is my actual main file, named tests.cpp. And yes, both TestOneToOne and TestOneToMany have the Q_OBJECT macro.

              #include <QCoreApplication>
              #include <QTest>
              
              #include "TestOneToOne.h"
              #include "TestOneToMany.h"
              
              int main(int argc, char *argv[])
              {
                  int status = 0;
                  status |= QTest::qExec(new TestOneToOne, argc, argv);
                  status |= QTest::qExec(new TestOneToMany, argc, argv);
              
                  return status;
              }
              
              #include "TestOneToOne.moc"
              #include "TestOneToMany.moc"
              
              
              Christian EhrlicherC 1 Reply Last reply
              0
              • rpieketR rpieket

                The mismatch is due to my attempt to simplify before posting. This is my actual main file, named tests.cpp. And yes, both TestOneToOne and TestOneToMany have the Q_OBJECT macro.

                #include <QCoreApplication>
                #include <QTest>
                
                #include "TestOneToOne.h"
                #include "TestOneToMany.h"
                
                int main(int argc, char *argv[])
                {
                    int status = 0;
                    status |= QTest::qExec(new TestOneToOne, argc, argv);
                    status |= QTest::qExec(new TestOneToMany, argc, argv);
                
                    return status;
                }
                
                #include "TestOneToOne.moc"
                #include "TestOneToMany.moc"
                
                
                Christian EhrlicherC Offline
                Christian EhrlicherC Offline
                Christian Ehrlicher
                Lifetime Qt Champion
                wrote on last edited by
                #9

                There is no need for foo.moc files when it's in a header. Then qmake/cmake automatically creates and adds moc_foo.cpp files.

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

                rpieketR 1 Reply Last reply
                0
                • Christian EhrlicherC Christian Ehrlicher

                  There is no need for foo.moc files when it's in a header. Then qmake/cmake automatically creates and adds moc_foo.cpp files.

                  rpieketR Offline
                  rpieketR Offline
                  rpieket
                  wrote on last edited by
                  #10

                  @Christian-Ehrlicher Without the moc files, I get:

                  ld: Undefined symbols:
                    vtable for TestOneToOne, referenced from:
                        _main in tests.o
                    vtable for TestOneToMany, referenced from:
                        _main in tests.o
                  

                  With the moc files, it was working until this afternoon. Somehow I broke something, but I don't know what.

                  Christian EhrlicherC C 2 Replies Last reply
                  0
                  • rpieketR rpieket

                    @Christian-Ehrlicher Without the moc files, I get:

                    ld: Undefined symbols:
                      vtable for TestOneToOne, referenced from:
                          _main in tests.o
                      vtable for TestOneToMany, referenced from:
                          _main in tests.o
                    

                    With the moc files, it was working until this afternoon. Somehow I broke something, but I don't know what.

                    Christian EhrlicherC Offline
                    Christian EhrlicherC Offline
                    Christian Ehrlicher
                    Lifetime Qt Champion
                    wrote on last edited by
                    #11

                    Please show a minmal, compileable example and move code into source files and not in headers. qmake will not generate a moc_foo.cpp when there is no corresponding source file.

                    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
                    • rpieketR rpieket

                      @Christian-Ehrlicher Without the moc files, I get:

                      ld: Undefined symbols:
                        vtable for TestOneToOne, referenced from:
                            _main in tests.o
                        vtable for TestOneToMany, referenced from:
                            _main in tests.o
                      

                      With the moc files, it was working until this afternoon. Somehow I broke something, but I don't know what.

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

                      The headers need to be listed in the PRO file:

                      HEADERS += TestOneToOne.h TestOneToMany.h
                      

                      and qmake re-run. The magic moc includes are not required.

                      Edit: Maybe @Christian-Ehrlicher has a point: a one-to-one header-source relationship.

                      Christian EhrlicherC 1 Reply Last reply
                      1
                      • C ChrisW67

                        The headers need to be listed in the PRO file:

                        HEADERS += TestOneToOne.h TestOneToMany.h
                        

                        and qmake re-run. The magic moc includes are not required.

                        Edit: Maybe @Christian-Ehrlicher has a point: a one-to-one header-source relationship.

                        Christian EhrlicherC Offline
                        Christian EhrlicherC Offline
                        Christian Ehrlicher
                        Lifetime Qt Champion
                        wrote on last edited by
                        #13

                        @ChrisW67 said in moc file not found:

                        Edit: Maybe @Christian-Ehrlicher has a point: a one-to-one header-source relationship

                        I'm not completely sure since I don't use qmake since 15 years or so but how else should qmake know that it has to moc those files.

                        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
                        • SGaistS Offline
                          SGaistS Offline
                          SGaist
                          Lifetime Qt Champion
                          wrote on last edited by
                          #14

                          Hi,

                          You can see in this thread a way to put together multiple tests.

                          That said, it will break the output. You should really keep the one class per test file.

                          @Christian-Ehrlicher the moc file include is standard when you define classes in the implementation file. It has some other benefits.

                          This blog article gives a pretty good summary about them.

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

                          rpieketR 1 Reply Last reply
                          0
                          • SGaistS SGaist

                            Hi,

                            You can see in this thread a way to put together multiple tests.

                            That said, it will break the output. You should really keep the one class per test file.

                            @Christian-Ehrlicher the moc file include is standard when you define classes in the implementation file. It has some other benefits.

                            This blog article gives a pretty good summary about them.

                            rpieketR Offline
                            rpieketR Offline
                            rpieket
                            wrote on last edited by rpieket
                            #15

                            Minimal code. First main.cpp

                            #include <QCoreApplication>
                            #include <QTest>
                            QTEST_MAIN(TestQString)
                            

                            And qteststring.h:

                            #pragma once
                            #include <QObject>
                            class TestQString: public QObject
                            {
                                Q_OBJECT
                            private slots:
                                void toUpper();
                            };
                            

                            And qteststring.cpp:

                            #include <QTest>
                            #include "testqstring.h"
                            void TestQString::toUpper()
                            {
                                QString str = "Hello";
                                QCOMPARE(str.toUpper(), QString("HELLO"));
                            }
                            #include "testqstring.moc"
                            

                            Finally the auto-generated .pro file:

                            QT = core
                            
                            CONFIG += c++17 cmdline
                            
                            # 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 \
                                    testqstring.cpp
                            
                            # Default rules for deployment.
                            qnx: target.path = /tmp/$${TARGET}/bin
                            else: unix:!android: target.path = /opt/$${TARGET}/bin
                            !isEmpty(target.path): INSTALLS += target
                            
                            HEADERS += \
                                testqstring.h
                            

                            Resulting output:

                            make: *** No rule to make target `testqstring.moc', needed by `testqstring.o'.  Stop.
                            make: *** Waiting for unfinished jobs....
                            ../Test_with_qmake/main.cpp:2:10: fatal error: 'QTest' file not found
                            #include <QTest>
                                     ^~~~~~~
                            1 error generated.
                            make: *** [main.o] Error 1
                            14:28:39: The process "/usr/bin/make" exited with code 2.
                            Error while building/deploying project Test_with_qmake (kit: Qt 6.6.1 for macOS)
                            When executing step "Make"
                            
                            

                            BTW I have never seen a moc_*.cpp, only a *.moc, and then only until yesterday afternoon, when it stopped working altogether.
                            Should I be using cmake? I have no preference. I'm using qmake only because it was the default.

                            Christian EhrlicherC C 2 Replies Last reply
                            0
                            • rpieketR rpieket

                              Minimal code. First main.cpp

                              #include <QCoreApplication>
                              #include <QTest>
                              QTEST_MAIN(TestQString)
                              

                              And qteststring.h:

                              #pragma once
                              #include <QObject>
                              class TestQString: public QObject
                              {
                                  Q_OBJECT
                              private slots:
                                  void toUpper();
                              };
                              

                              And qteststring.cpp:

                              #include <QTest>
                              #include "testqstring.h"
                              void TestQString::toUpper()
                              {
                                  QString str = "Hello";
                                  QCOMPARE(str.toUpper(), QString("HELLO"));
                              }
                              #include "testqstring.moc"
                              

                              Finally the auto-generated .pro file:

                              QT = core
                              
                              CONFIG += c++17 cmdline
                              
                              # 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 \
                                      testqstring.cpp
                              
                              # Default rules for deployment.
                              qnx: target.path = /tmp/$${TARGET}/bin
                              else: unix:!android: target.path = /opt/$${TARGET}/bin
                              !isEmpty(target.path): INSTALLS += target
                              
                              HEADERS += \
                                  testqstring.h
                              

                              Resulting output:

                              make: *** No rule to make target `testqstring.moc', needed by `testqstring.o'.  Stop.
                              make: *** Waiting for unfinished jobs....
                              ../Test_with_qmake/main.cpp:2:10: fatal error: 'QTest' file not found
                              #include <QTest>
                                       ^~~~~~~
                              1 error generated.
                              make: *** [main.o] Error 1
                              14:28:39: The process "/usr/bin/make" exited with code 2.
                              Error while building/deploying project Test_with_qmake (kit: Qt 6.6.1 for macOS)
                              When executing step "Make"
                              
                              

                              BTW I have never seen a moc_*.cpp, only a *.moc, and then only until yesterday afternoon, when it stopped working altogether.
                              Should I be using cmake? I have no preference. I'm using qmake only because it was the default.

                              Christian EhrlicherC Offline
                              Christian EhrlicherC Offline
                              Christian Ehrlicher
                              Lifetime Qt Champion
                              wrote on last edited by
                              #16

                              @rpieket said in moc file not found:

                              #include <QTest>

                              Then you should also add the correct qmake command as written in the documentation.

                              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
                              • rpieketR rpieket

                                Minimal code. First main.cpp

                                #include <QCoreApplication>
                                #include <QTest>
                                QTEST_MAIN(TestQString)
                                

                                And qteststring.h:

                                #pragma once
                                #include <QObject>
                                class TestQString: public QObject
                                {
                                    Q_OBJECT
                                private slots:
                                    void toUpper();
                                };
                                

                                And qteststring.cpp:

                                #include <QTest>
                                #include "testqstring.h"
                                void TestQString::toUpper()
                                {
                                    QString str = "Hello";
                                    QCOMPARE(str.toUpper(), QString("HELLO"));
                                }
                                #include "testqstring.moc"
                                

                                Finally the auto-generated .pro file:

                                QT = core
                                
                                CONFIG += c++17 cmdline
                                
                                # 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 \
                                        testqstring.cpp
                                
                                # Default rules for deployment.
                                qnx: target.path = /tmp/$${TARGET}/bin
                                else: unix:!android: target.path = /opt/$${TARGET}/bin
                                !isEmpty(target.path): INSTALLS += target
                                
                                HEADERS += \
                                    testqstring.h
                                

                                Resulting output:

                                make: *** No rule to make target `testqstring.moc', needed by `testqstring.o'.  Stop.
                                make: *** Waiting for unfinished jobs....
                                ../Test_with_qmake/main.cpp:2:10: fatal error: 'QTest' file not found
                                #include <QTest>
                                         ^~~~~~~
                                1 error generated.
                                make: *** [main.o] Error 1
                                14:28:39: The process "/usr/bin/make" exited with code 2.
                                Error while building/deploying project Test_with_qmake (kit: Qt 6.6.1 for macOS)
                                When executing step "Make"
                                
                                

                                BTW I have never seen a moc_*.cpp, only a *.moc, and then only until yesterday afternoon, when it stopped working altogether.
                                Should I be using cmake? I have no preference. I'm using qmake only because it was the default.

                                C Offline
                                C Offline
                                ChrisW67
                                wrote on last edited by ChrisW67
                                #17

                                @rpieket
                                The file names in the PRO file do not match those in your post.

                                Simple fix so that qmake now finds files.

                                A Qt test is just another Qt program, following all the same rules. It is just that the Test Lib writes main() for you to allow it to provide a lot of plumbing for you behind the scenes.
                                If you have the test class declaration in a separate header, as in this case, then that header should be listed in the PRO file HEADERS variable and not in the source file as an #include "blah.moc".

                                No longer get: make: *** No rule to make target `testqstring.moc', needed by `testqstring.o'. Stop

                                The QT variable in the PRO file needs QT += testlib so that the test Lib elements are included at compile and link time.
                                Rerun qmake after changing the PRO file

                                No longer get: ./Test_with_qmake/main.cpp:2:10: fatal error: 'QTest' file not found

                                Remaining problems are to do with the construction of the sources and not qmake.
                                main.cpp needs to #include "qteststring.h" so that the QTEST_MAIN macro expansion, which references TestString, knows what the class looks like.

                                Test compiles

                                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
                                • Unsolved