Ошибка LNK 2019 при использовании пользовательского класса в MFC

Я разработал два класса для запуска устройства захвата кадров камеры в консольном приложении (один для захвата изображений, а другой для их обработки) и теперь хотел бы реализовать эти классы в проекте MFC. Класс отлично работает в консольном приложении. Когда я пытался использовать их в приложении MFC, я получаю ошибки LNK2019. Вот некоторые фрагменты кода, класс отображения изображения написан очень похожим образом:

Класс IMAQ (для захвата изображений): IMAQ.h:

#pragma once
#include <queue>
#include <fstream>
#include "CircularInterface.h"
...  // some more includes

class IMAQ
{
public:
explicit    IMAQ();
virtual     ~IMAQ();

int SetupAcq(pRTCaptureStruc pRTCaptStruc);
... // some more functions

// The image acquisition thread
UINT    ImgAcqThread(LPVOID lpdwParam);

private:
BFU32   BdNum,
    BdInitOptns,
    NumBuffers,
    CircInitOptions;

// image acquisition parameters
BFU32   ImageSize,
    BitDepth,
    Xsize,
    Ysize,
    NumPixels,
    BytesPerPix;
bool    GetFrame;

    ... // some more private members

};  // class IMAQ

IMAQ.cpp:

#include "..\\Include\\IMAQClass.h"


IMAQ::IMAQ()
{
BdNum = 0;
BdInitOptns = CiSysInitialize;
CircInitOptions = BiAqEngJ;
NumBuffers = 4;
FilePath = NULL;
_isClean = true;
}  

IMAQ::~IMAQ()
{
// Empty destructor
}

int IMAQ::SetupAcq(pRTCaptureStruc pRTCaptStruc)
{
...// left out code for brevity
}

... // some more functions, all functions declared in header file are defined.

uOCT MFC AppDlg.h:

#pragma once

#include "ImgDspClass.h"
#include "IMAQClass.h"
#include "afxwin.h"

// CuOCTMFCAppDlg dialog
class CuOCTMFCAppDlg : public CDialogEx
{

public:
HBITMAP hBmpWellA6;
BITMAP  BmpWellA6;
UINT8   *pBitsWellA6;

BITMAPINFOHEADER    bmpInfo;

IMAQ                ImgAcq;
ImgDspClass         ImgDsp;

char    *LUTpath;
char    FileName[FILENAME_MAX];

  ... // more members
};

uOCT MFC AppDlg.cpp:

#include "stdafx.h"
#include "uOCT MFC App.h"
#include "uOCT MFC AppDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CAboutDlg dialog used for App About

class CAboutDlg : public CDialogEx
{
public:
    CAboutDlg();

// Dialog Data
    enum { IDD = IDD_ABOUTBOX };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

// Implementation
protected:
    DECLARE_MESSAGE_MAP()
};

BOOL CuOCTMFCAppDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
    BOOL bNameValid;
    CString strAboutMenu;
    bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
    ASSERT(bNameValid);
    if (!strAboutMenu.IsEmpty())
    {
        pSysMenu->AppendMenu(MF_SEPARATOR);
        pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    }
}

// Set the icon for this dialog.  The framework does this automatically
//  when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE);         // Set big icon
SetIcon(m_hIcon, FALSE);        // Set small icon


// Change the file path here to change save location
ImgAcq.SetFilePath("C:\\Users\\uOCT clone\\Documents\\temporary\\test.dat");
ImgDsp.SetReferencePath("C:\\Users\\uOCT clone\\Documents\\temporary\\ref.dat");

return TRUE;  // return TRUE  unless you set the focus to a control
}

В заголовочный файл диалогового окна MFC я включаю заголовочный файл IMAQClass.h, которого достаточно для правильной работы консольного приложения, однако, как я уже сказал выше, приложение MFC возвращает неразрешенные ошибки внешнего символа. Сетинги проекта MFC additional include directories включают каталог, содержащий заголовочный файл IMAQ.

Почему я получаю неразрешенные внешние факторы? Спасибо

Сообщение об ошибке в соответствии с запросом:

 1>uOCT MFC App.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall IMAQ::~IMAQ(void)" (??1IMAQ@@UAE@XZ) referenced in function "public: virtual __thiscall CuOCTMFCAppDlg::~CuOCTMFCAppDlg(void)" (??1CuOCTMFCAppDlg@@UAE@XZ)
 1>uOCT MFC AppDlg.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall IMAQ::~IMAQ(void)" (??1IMAQ@@UAE@XZ)
 1>uOCT MFC App.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall ImgDspClass::~ImgDspClass(void)" (??1ImgDspClass@@UAE@XZ) referenced in function "public: virtual __thiscall CuOCTMFCAppDlg::~CuOCTMFCAppDlg(void)" (??1CuOCTMFCAppDlg@@UAE@XZ)
 1>uOCT MFC AppDlg.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall ImgDspClass::~ImgDspClass(void)" (??1ImgDspClass@@UAE@XZ)
 1>uOCT MFC AppDlg.obj : error LNK2019: unresolved external symbol "public: __thiscall ImgDspClass::ImgDspClass(void)" (??0ImgDspClass@@QAE@XZ) referenced in function "public: __thiscall CuOCTMFCAppDlg::CuOCTMFCAppDlg(class CWnd *)" (??0CuOCTMFCAppDlg@@QAE@PAVCWnd@@@Z)
 1>uOCT MFC AppDlg.obj : error LNK2019: unresolved external symbol "public: __thiscall IMAQ::IMAQ(void)" (??0IMAQ@@QAE@XZ) referenced in function "public: __thiscall CuOCTMFCAppDlg::CuOCTMFCAppDlg(class CWnd *)" (??0CuOCTMFCAppDlg@@QAE@PAVCWnd@@@Z)
 1>uOCT MFC AppDlg.obj : error LNK2019: unresolved external symbol "public: int __thiscall ImgDspClass::SetReferencePath(char * const)" (?SetReferencePath@ImgDspClass@@QAEHQAD@Z) referenced in function "protected: virtual int __thiscall CuOCTMFCAppDlg::OnInitDialog(void)" (?OnInitDialog@CuOCTMFCAppDlg@@MAEHXZ)
 1>uOCT MFC AppDlg.obj : error LNK2019: unresolved external symbol "public: int __thiscall IMAQ::SetFilePath(char * const)" (?SetFilePath@IMAQ@@QAEHQAD@Z) referenced in function "protected: virtual int __thiscall CuOCTMFCAppDlg::OnInitDialog(void)" (?OnInitDialog@CuOCTMFCAppDlg@@MAEHXZ)

РЕДАКТИРОВАТЬ: проблема решена, но я думаю, я действительно не понимаю, почему.

Итак, в опубликованных комментариях говорилось, что мне нужно сделать ссылку на файл библиотеки. Два класса, с которыми у меня возникла проблема, не генерируют файлы .dll и .lib, а только .obj. Но по прихоти я вернулся и включил файл .obj в зависимости ссылок.

Итак, теперь мой вопрос: файлы .obj должны быть связаны как библиотеки, если они не генерируются вместе с исполняемым файлом?


person GregD    schedule 23.04.2012    source источник
comment
Как насчет того, чтобы опубликовать точное сообщение об ошибке, т. е. какие символы не определены? Включение заголовка — это одно, но если это просто интерфейс к библиотеке, вам также нужно связать его с настройками вашего компоновщика.   -  person Ed S.    schedule 24.04.2012
comment
Добавлены сообщения об ошибках. Классы IMAQ и ImageDisplay не создают библиотечные файлы. Однако мне нужно как-то ссылаться на объектные файлы, которые они генерируют?   -  person GregD    schedule 24.04.2012
comment
Да, похоже, вы не связываете код в своем проекте.   -  person Jonathan Wood    schedule 24.04.2012
comment
Код должен откуда-то взяться. Если у вас есть исходники в вашем проекте, он создает файлы .obj и знает, что их нужно включить, но если все, что у вас есть, это .obj, он не ищет их - вы также должны включить их в проект.   -  person Mark Ransom    schedule 24.04.2012


Ответы (1)


Вы не дали нам достаточно подробностей, чтобы помочь вам. Вы сказали нам, что получаете ошибку компоновщика, но вам нужно сообщить нам точное сообщение об ошибке, т. е. какие символы не определены?

Вот мое предположение; вы включили дополнительный заголовочный файл. Этот заголовочный файл является частью библиотеки, но вы не скомпоновали саму библиотеку, а включили только заголовок. Итак, вы правильно поняли первую часть, теперь вам нужно открыть страницу настроек компоновщика, добавить дополнительный каталог библиотеки (т. е. там, где находится файл реализации .lib, .obj, .любой), а затем добавить имя библиотеки. в раздел «Дополнительные зависимости».

person Ed S.    schedule 23.04.2012
comment
Понял: мне пришлось связать файл .obj. Я не знал, что такая связь была необходима. - person GregD; 24.04.2012
comment
@GregD: компоновщик должен иметь доступ к определениям где-то, файлов заголовков недостаточно. - person Ed S.; 24.04.2012