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. moc file not found
Forum Updated to NodeBB v4.3 + New Features

moc file not found

Scheduled Pinned Locked Moved Unsolved General and Desktop
17 Posts 5 Posters 3.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.
  • rpieketR Offline
    rpieketR Offline
    rpieket
    wrote on last edited by
    #1

    Using Qt Creator 12.0.1, plodding along just fine until all of a sudden, moc files are no longer getting created. This was working before, but now I get an error saying that the moc file cannot be found. How do I get this working again? I have reduced my code to the following. Why is this not compiling?

    #include <QCoreApplication>
    #include <QTest>
    
    class TestQString: public QObject
    {
        Q_OBJECT
    private slots:
        void toUpper()
        {
            QString str = "Hello";
            QVERIFY(str.toUpper() == "HELLO");
        }
    };
    
    QTEST_MAIN(TestQString)
    #include "testqstring.moc"
    
    Christian EhrlicherC 1 Reply Last reply
    0
    • rpieketR rpieket

      Using Qt Creator 12.0.1, plodding along just fine until all of a sudden, moc files are no longer getting created. This was working before, but now I get an error saying that the moc file cannot be found. How do I get this working again? I have reduced my code to the following. Why is this not compiling?

      #include <QCoreApplication>
      #include <QTest>
      
      class TestQString: public QObject
      {
          Q_OBJECT
      private slots:
          void toUpper()
          {
              QString str = "Hello";
              QVERIFY(str.toUpper() == "HELLO");
          }
      };
      
      QTEST_MAIN(TestQString)
      #include "testqstring.moc"
      
      Christian EhrlicherC Offline
      Christian EhrlicherC Offline
      Christian Ehrlicher
      Lifetime Qt Champion
      wrote on last edited by
      #2

      Please show your CMakeLists.txt

      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

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