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. Undefined Reference
Qt 6.11 is out! See what's new in the release blog

Undefined Reference

Scheduled Pinned Locked Moved Unsolved General and Desktop
8 Posts 3 Posters 645 Views 1 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.
  • O Offline
    O Offline
    ofmrew
    wrote on last edited by
    #1

    I am trying to create column-major matrix, but of the constructors gives an undefined reference, but I cannot see the problem. I found similar code in woboq for QMatrix4x4.
    I am using Win11 and mingw. Thanks.

    #include "mymatrix3d.h"
    
    MyMatrix3D::MyMatrix3D(){}
    MyMatrix3D::MyMatrix3D(
            qreal m11,qreal m12,qreal m13,qreal m14,
            qreal m21,qreal m22,qreal m23,qreal m24,
            qreal m31,qreal m32,qreal m33,qreal m34,
            qreal m41,qreal m42,qreal m43,qreal m44){
        e[0][0]=m11;
        e[0][1]=m12;
        e[0][2]=m13;
        e[0][3]=m14;
        e[1][0]=m21;
        e[1][1]=m22;
        e[1][2]=m23;
        e[1][3]=m24;
        e[2][0]=m31;
        e[2][1]=m32;
        e[2][2]=m33;
        e[2][3]=m34;
        e[3][0]=m41;
        e[3][1]=m42;
        e[3][2]=m43;
        e[3][3]=m44;
    }
    MyMatrix3D::MyMatrix3D(qreal *elements[]){
        for(int row=0; row<4; row++) {
            for(int col=0; col<4; col++) {
                e[row][col]=*elements[row*8 + col];};};
    }
    

    #ifndef MYMATRIX3D_H
    #define MYMATRIX3D_H
    #include <QtMath>
    #include <QDebug>
    #include <QDebugStateSaver>
    #include "mypoint3d.h"

    class MyMatrix3D
    {
    public:
    MyMatrix3D();
    MyMatrix3D(qreal, qreal, qreal, qreal, qreal, qreal, qreal, qreal, qreal, qreal, qreal, qreal, qreal, qreal, qreal, qreal);
    MyMatrix3D(qreal *elements[]);
    qreal e[4][4];
    qreal row1[4];
    qreal row2[4];
    qreal row3[4];
    };

    #endif // MYMATRIX3D_H

    1 Reply Last reply
    0
    • Christian EhrlicherC Offline
      Christian EhrlicherC Offline
      Christian Ehrlicher
      Lifetime Qt Champion
      wrote on last edited by
      #2

      And you really compile mymatrix3d.cpp in your project? I would guess no.

      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
      • O Offline
        O Offline
        ofmrew
        wrote on last edited by
        #3

        Yes. I should have added that it is third constructor that gives the problem.

        I get :
        D:\QtPrograms\build-3DModeling-Desktop_Qt_6_2_0_MinGW_64_bit-Debug..\3DModeling\mainwindow.cpp:14: error: undefined reference to MyMatrix3D::MyMatrix3D(double (*) [4])' debug/mainwindow.o: In function MainWindow::MainWindow(QWidget*)':
        D:\QtPrograms\build-3DModeling-Desktop_Qt_6_2_0_MinGW_64_bit-Debug/../3DModeling/mainwindow.cpp:14: undefined reference to `MyMatrix3D::MyMatrix3D(double (*) [4])'

        1 Reply Last reply
        0
        • Christian EhrlicherC Offline
          Christian EhrlicherC Offline
          Christian Ehrlicher
          Lifetime Qt Champion
          wrote on last edited by
          #4

          How do you call it? Why do you need this ctor at all? Pass a properly aligned std::array so you don't have to make sure it's length is correct.

          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
          • O Offline
            O Offline
            ofmrew
            wrote on last edited by
            #5

            Long story, but the short version is: 1. QMatrix4x4 uses floats and I want qreals because I want to do modeling and not just graphics. 2. Looking ahead when OpenGL will be replaced by renders which will culling will be done on the CPU side. 3. I want to incorporate intrinsics to improve performance.

            What can I do to gather the information to help solve this problem.

            How does it differ from what I found in qmatrix4x4.cpp, namely:

            QMatrix4x4::QMatrix4x4(const float *values)
            {
                for (int row = 0; row < 4; ++row)
                    for (int col = 0; col < 4; ++col)
                        m[col][row] = values[row * 4 + col];
                flagBits = General;
            }
            

            Any help will be greatly appreciated, thanks.

            JonBJ 1 Reply Last reply
            0
            • Christian EhrlicherC Offline
              Christian EhrlicherC Offline
              Christian Ehrlicher
              Lifetime Qt Champion
              wrote on last edited by
              #6

              The QMatrix ctor takes a pointer to a float, you pass a pointer to a pointer of a float. Both are very problematic because none of them has the chance to check the size of the values.

              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
              • O ofmrew

                Long story, but the short version is: 1. QMatrix4x4 uses floats and I want qreals because I want to do modeling and not just graphics. 2. Looking ahead when OpenGL will be replaced by renders which will culling will be done on the CPU side. 3. I want to incorporate intrinsics to improve performance.

                What can I do to gather the information to help solve this problem.

                How does it differ from what I found in qmatrix4x4.cpp, namely:

                QMatrix4x4::QMatrix4x4(const float *values)
                {
                    for (int row = 0; row < 4; ++row)
                        for (int col = 0; col < 4; ++col)
                            m[col][row] = values[row * 4 + col];
                    flagBits = General;
                }
                

                Any help will be greatly appreciated, thanks.

                JonBJ Online
                JonBJ Online
                JonB
                wrote on last edited by JonB
                #7

                @ofmrew said in Undefined Reference:

                How does it differ from what I found in qmatrix4x4.cpp, namely:

                MyMatrix3D(qreal *elements[])
                

                is not the same level of indirection as

                QMatrix4x4(const float *values)
                

                Humour me: if you declared yours as qreal **elements (or qreal *elements if that is what you really intend) that might make the linker error go away?

                1 Reply Last reply
                0
                • O Offline
                  O Offline
                  ofmrew
                  wrote on last edited by
                  #8

                  My mistake. If you note the second constructor does what I want: get a two dimensional array of [row ][column] that will allow me to construct a contiguous array of qreals. White the final constructor I was trying to make it less verbose. Some other languages allow something like x[0][:] to return and array with the first row of x[][].

                  Also, I will note that I have watching on but I do not get a notification unless I click no the icon, before a number, representing the number of notifications, would appear on the icon.

                  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