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

Undefined Reference

Scheduled Pinned Locked Moved Unsolved General and Desktop
8 Posts 3 Posters 473 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 Offline
                JonBJ Offline
                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