未定义的参考`Histogram :: Histogram(QWidget *)

时间:2017-05-23 21:03:48

标签: c++ qt qmake

我正在尝试使用qmake和make为uEye相机编译相机软件。

我的qmake命令运行正常但是当我在命令行输入make时出现以下错误

make[1]: Entering directory '/usr/src/ids/ueyedemo'
g++ -m64 -Wl,-O1 -o ueyedemo release/tabxs.o release/tabsizexs.o release/tabcamera.o release/tabimage.o release/tabsize.o release/tabprocessing.o release/tabformat.o release/tabio.o release/qsliderex.o release/imageinfodlg.o release/properties.o release/cameralist.o release/main.o release/mainview.o release/eventthread.o release/paintlabel.o release/tabhotpixel.o release/moc_qsliderex.o release/moc_imageinfodlg.o release/moc_properties.o release/moc_cameralist.o release/moc_mainview.o release/moc_eventthread.o release/moc_paintlabel.o release/qrc_mainview.o    -L/usr/lib/x86_64-linux-gnu -L/usr/X11R6/lib64 -lueye_api -lQtOpenGL -lQtGui -lQtCore -lGL -lpthread 
release/mainview.o: In function `Mainview::onHistogram(bool)':
mainview.cpp:(.text+0x1ada): undefined reference to `Histogram::Histogram(QWidget*)'
release/mainview.o: In function `Mainview::DrawImage(char*)':
mainview.cpp:(.text+0x87c1): undefined reference to `Histogram::updateHistogram(unsigned int, char*)'
collect2: error: ld returned 1 exit status
Makefile.Release:151: recipe for target 'ueyedemo' failed
make[1]: *** [ueyedemo] Error 1
make[1]: Leaving directory '/usr/src/ids/ueyedemo'
Makefile:34: recipe for target 'release' failed
make: *** [release] Error 2

有人可以告诉我问题可能在哪里吗?我以为我可能有错误的qt或qmake版本?

histogram.cpp

#include "histogram.h"
#include "ui_histogram.h"

#include <QPixmap>
#include <QPainter>
#include <QPen>
#include <QtCore/qmath.h>
#include <QMessageBox>
#include <QMap>

Histogram::Histogram(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Histogram)
{
    ui->setupUi(this);
    connect(ui->pushButtonClose, SIGNAL(clicked()), this, SLOT(close()));
    connect(ui->pushButtonClose, SIGNAL(clicked()), parent, SLOT(closeHistogram()));
    setWindowTitle("uEye Histogram");
}

Histogram::~Histogram()
{
    delete ui;
}

bool Histogram::updateHistogram(HIDS hCam, char *pBuffer)
{
    uint32_t pixmapWidth = ui->labelHistogram->width();
    uint32_t pixmapHeight = ui->labelHistogram->height();
    QPixmap histogram(pixmapWidth, pixmapHeight);
    histogram.fill(Qt::lightGray);

    int nRet = IS_NO_SUCCESS, imageID = 0, colormode = 0;
    char* pImgMem = NULL;

    nRet = is_GetActSeqBuf(hCam, &imageID, 0, &pImgMem);
    if (nRet != IS_SUCCESS)
    {
        return false;
    }

    colormode = is_SetColorMode(hCam, IS_GET_COLOR_MODE);
    if (colormode == IS_CM_MONO8)
    {
        ui->checkBoxHistogramGreen->setEnabled(false);
        ui->checkBoxHistogramRed->setEnabled(false);
    }
    else
    {
        ui->checkBoxHistogramGreen->setEnabled(true);
        ui->checkBoxHistogramRed->setEnabled(true);
    }

    uint32_t steps = 0, channels = 3, valuesPerChannel = 256, maxValue = 0;
    uint32_t bgrBuffer[valuesPerChannel * channels];
    memset(bgrBuffer, 0, sizeof(bgrBuffer) / sizeof(bgrBuffer[0]));

    nRet = is_GetImageHistogram(hCam, imageID, colormode, bgrBuffer);
    if (nRet != IS_SUCCESS)
    {
        return false;
    }

    for (size_t channel = 0; channel < channels; channel++)
    {
        if ((channel == 0 && ui->checkBoxHistogramBlue->isChecked()) ||
            (channel == 1 && ui->checkBoxHistogramGreen->isChecked()) ||
            (channel == 2 && ui->checkBoxHistogramRed->isChecked()))
        {
            if (colormode == IS_CM_MONO8 && channel > 0)
            {
                continue;
            }

            uint32_t* buffer = bgrBuffer + (1 << 8) * channel;
            for (size_t i = 0; i < valuesPerChannel; i++)
            {
                if (buffer[i] > maxValue)
                {
                    maxValue = buffer[i];
                }
            }
        }
    }

    if (colormode == IS_CM_BGR565_PACKED)
    {
        ui->histogramLabel128->setText(QString::number((1 << 6) / 2));
        ui->histogramLabel255->setText(QString::number((1 << 6) - 1));
    }
    else
    {
        ui->histogramLabel128->setText("128");
        ui->histogramLabel255->setText("255");
    }

    QPainter painter(&histogram);
    QPen pen(Qt::DashLine);
    QPolygon polygon;
    std::vector<QColor> colors;

    colors.push_back(QColor("blue"));
    colors.push_back(QColor("green"));
    colors.push_back(QColor("red"));

    pen.setColor(Qt::gray);
    pen.setWidth(1);
    painter.setPen(pen);
    painter.setBrush(Qt::lightGray);
    painter.drawRect(0, 0, pixmapWidth, pixmapHeight);

    steps = 1 << int(log(pixmapWidth / 10.0f) / log(2.0f));
    for (int i = 1; i < steps; ++i)
    {
        painter.drawLine((pixmapWidth * float(i) / steps), 1, (pixmapWidth * float(i) / steps), pixmapHeight - 1);
    }

    steps = 1 << int(log(pixmapHeight / 10.0f) / log(2.0f));
    for (int i = 1; i < steps; ++i)
    {
        painter.drawLine(1, pixmapHeight * float(i) / steps, pixmapWidth - 1, pixmapHeight * float(i) / steps);
    }

    painter.setRenderHint(QPainter::Antialiasing);
    pen.setStyle(Qt::SolidLine);

    qreal scaleWidth = pixmapWidth / double(valuesPerChannel - 1);
    qreal scaleHeight = pixmapHeight / double(maxValue);

    for (size_t channel = 0; channel < channels; channel++)
    {
        if ((channel == 0 && ui->checkBoxHistogramBlue->isChecked()) ||
            (channel == 1 && ui->checkBoxHistogramGreen->isChecked()) ||
            (channel == 2 && ui->checkBoxHistogramRed->isChecked()))
        {
            if (colormode == IS_CM_MONO8 && channel > 0)
            {
                continue;
            }
            if (colormode == IS_CM_BGR565_PACKED)
            {
                if (channel == 1)
                {
                    scaleWidth = pixmapWidth / double(256 / 8 * 6 - 1) * 3.0;
                }
                else
                {
                    scaleWidth = pixmapWidth / double(256 / 8 * 5 - 1) * 3.0;
                }
            }

            uint32_t* buffer = bgrBuffer + (1 << 8) * channel;

            pen.setColor(colors[channel]);
            painter.setPen(pen);
            painter.setBrush(Qt::transparent);

            polygon.clear();
            polygon << QPoint(pixmapWidth, pixmapHeight) << QPoint(0, pixmapHeight);

            for (size_t i = 0; i < valuesPerChannel; i++)
            {
                polygon << QPoint(scaleWidth * i, pixmapHeight - scaleHeight * buffer[i]);
            }

            painter.drawPolygon(polygon);
        }
    }

    ui->labelHistogram->setPixmap(histogram);

    return false;
}

mainview.cpp,其中调用updateHistogram

if(m_pHistogramDlg != 0)
{
    m_pHistogramDlg->updateHistogram(m_hCamera, pBuffer);
}

1 个答案:

答案 0 :(得分:1)

您可能忘记将def save(self, parent): if parent: self.instance.parent = parent 添加到$subscriberInfo = array( 'subscribers' => array( array( 'email' => "s", 'custom_fields'=> array('name' => "Bob") ) ) ); 文件中的histogram.cpp

SOURCES

命令行输出的第二行提到传递给链接器的所有文件,其中不包括.pro(即编译的SOURCES += histogram.cpp )。