2015-06-02 161 views
0

在我的應用程序中,我需要在不同時間在不同線程中使用幾個函數,並且我不想將它們複製粘貼到任何地方。Qt C++ - 未定義的引用...內聯QImage自定義函數

所以我做了一個commonfunctions.cpp和一個commonfunctions.h,並將它們包含在不同的地方。然而,一個(多個)功能拒絕工作。

錯誤:

undefined reference to `CommonFunctions::cvMatToQImage(cv::Mat const&)' 

commonfunctions.cpp中有這樣的功能:

inline QImage CommonFunctions::cvMatToQImage(const cv::Mat &inMat) { 
    (....) 
} 

commonfunctions.h

#ifndef COMMONFUNCTIONS 
#define COMMONFUNCTIONS 

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

#include <QImage> 

#include "opencv/cv.h" 
#include "opencv/highgui.h" 

class CommonFunctions 
{ 
public slots: 
    inline QImage cvMatToQImage(const cv::Mat &inMat); 
    void morphImage(cv::Mat threshold); 
    void detectingMarkers(cv::Mat threshold, cv::Mat frame, cv::Mat roi, 
          int markerSizeMin, int markerSizeMax, int markerNumber, 
          int roiX, int roiY, bool tracking, 
          int &liczbaZgubionych, QString &komunikat); 
}; 

#endif // COMMONFUNCTIONS 

在kalibracja.cpp呼叫

QImage image(commonFunctions.cvMatToQImage(frame)); 

我沒有忘記#include "commonfunctions.h"CommonFunctions commonFunctions;在kalibracja.cpp

編譯器知道有編譯這一切。 (* .pro文件)

SOURCES += main.cpp\ 
    mainwindow.cpp \ 
    kalibracja.cpp \ 
    guiKalibracja.cpp \ 
    commonfunctions.cpp \ 
    analiza.cpp 

HEADERS += mainwindow.h \ 
    kalibracja.h \ 
    analiza.h \ 
    commonfunctions.h 

時,我只是包括它的工作一個* .cpp文件,而是一個),這不是做的事情,我思的好方法,和b)不會讓我包括函數在不同的線程中。

什麼可能導致此錯誤?調用相關函數的正確方法是什麼?

+0

這是一個鏈接錯誤。編譯和鏈接'commonfunctions.cc'應該可以解決它。 –

+0

commonfunctions.cc? – Petersaber

+0

你是如何編譯你的項目的? –

回答

4

我不認爲你可以在.cpp文件中聲明內聯成員函數。取自another answer

Note: It's imperative that the function's definition (the part between the {...}) be placed in a header file, unless the function is used only in a single .cpp file. In particular, if you put the inline function's definition into a .cpp file and you call it from some other .cpp file, you'll get an "unresolved external" error from the linker.

+0

奇怪。以前我有一個無頭文件* .cpp文件的功能,它的工作...當我不得不做更多的線程(因爲你不能共享* .cpp文件,只有頭文件)出現問題。雖然你的答案解決了我的問題。將定義放在頭文件中並從* .cpp中移除它已經完成了工作 - 我認爲程序已經編譯並且所有的線程和對象都可以訪問這個函數。該應用程序編譯。 – Petersaber

0

您需要編譯kalibracja.cppcommonfunctions.cpp,然後將它們鏈接在一起。

+0

但是爲什麼只有一個功能會導致問題呢? – Petersaber