Как устранить ошибку LNK2019 в Visual Studio при использовании библиотек Qt и DCMTK?

Я знаю, что этот вопрос задавали уже много раз, но извините, я просто не могу понять, что не так с тем, что я делаю.

Я хочу прочитать изображение DICOM (по пикселям, потому что я должен выполнять с ним операции) и отобразить его в графическом интерфейсе Qt.

У меня Windows 8 и Visual Studio 2013. Я загрузил Qt с открытым исходным кодом, а также плагин VS для него. Я построил Qt с помощью cmake-gui. Затем я последовал тому, что было сказано в обсуждении здесь, в stackoverflow, под названием «Как использовать DCMTK в Qt». Я загрузил DCMTK 3.6.0, настроил и сгенерировал его с помощью cmake-gui, построил его проекты ALL_BUILD и INSTALL в VS. Пока все удачно. Затем я попытался создать простую программу, которая будет читать изображение DICOM и отображать его.

Я создал новое приложение Qt и назвал его MainWindow. Вот мой mainwindow.cpp:

#include "mainwindow.h"
#include <dcmtk\config\osconfig.h>
#include <dcmtk\ofstd\ofcond.h>
#include <dcmtk\ofstd\ofstring.h>
#include <dcmtk\dcmdata\dctk.h>
#include <dcmtk\dcmdata\dcfilefo.h>
#include <dcmtk\dcmdata\dcitem.h>
#include <dcmtk\dcmdata\dcdeftag.h>
#include <dcmtk\dcmdata\dctagkey.h>

void MainWindow::tryDCMTK() {
    DcmFileFormat fileformat;
    OFCondition status = fileformat.loadFile("C:/Users/Kriselle/Documents/000004.dcm");
    if (status.good())
    {
        OFString patientsName;
        if (fileformat.getDataset()->findAndGetOFString(DCM_PatientName, patientsName).good())
        {
            printf("Patient's Name: %s",patientsName);
        }
        else
            printf("Error: cannot access Patient's Name!");
    }
    else
        printf("Error: cannot read DICOM file (%s)", status.text());
}

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
    ui.setupUi(this);
}

MainWindow::~MainWindow() {}

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtWidgets/QMainWindow>
#include "ui_mainwindow.h"

class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindowClass ui;
    void tryDCMTK();
};

#endif // MAINWINDOW_H

MainWindow.pro

# ----------------------------------------------------
# This file is generated by the Qt Visual Studio Add-in.
# ------------------------------------------------------

TEMPLATE = app
TARGET = MainWindow
DESTDIR = ../Win32/Debug
QT += core widgets gui
CONFIG += debug console
DEFINES += WIN64 QT_DLL QT_WIDGETS_LIB _REENTRANT
INCLUDEPATH += ./GeneratedFiles \
    . \
    ./GeneratedFiles/Debug \
    "C:/Program Files (x86)/DCMTK/include"
DEPENDPATH += .
MOC_DIR += ./GeneratedFiles/debug
OBJECTS_DIR += debug
UI_DIR += ./GeneratedFiles
RCC_DIR += ./GeneratedFiles
HEADERS += ../../../../../../../DICOMSDL/include/dicom.h \
    ./dicomcfg.h \
    ./mainwindow.h
SOURCES += ./main.cpp \
    ./mainwindow.cpp
FORMS += ./mainwindow.ui
RESOURCES += mainwindow.qrc

QMAKE_CFLAGS_RELEASE -= -MD
QMAKE_CFLAGS_RELEASE = -MT
QMAKE_CFLAGS_DEBUG -= -MDd
QMAKE_CFLAGS_DEBUG = -MTd
QMAKE_CXXFLAGS_RELEASE -= -MD
QMAKE_CXXFLAGS_RELEASE += -MT
QMAKE_CXXFLAGS_DEBUG -= -MDd
QMAKE_CXXFLAGS_DEBUG += -MTd

#a example: LIBS += -L"../../../test_dcmtk/DCMTK/lib" \
LIBS += -L"C:/Program Files (x86)/DCMTK/lib" \
-lconfig \
-lofstd \
-ldcmdata \
-loflog \
-lws2_32 \
-lnetapi32 \
-lwsock32 \
-ladvapi32 

Когда я попытался запустить его, возникли следующие 7 ошибок LNK2019:

1>mainwindow.obj : error LNK2019: unresolved external symbol "public: __cdecl OFString::OFString(void)" (??0OFString@@QEAA@XZ) referenced in function "private: void __cdecl MainWindow::tryDCMTK(void)" (?tryDCMTK@MainWindow@@AEAAXXZ)
1>mainwindow.obj : error LNK2019: unresolved external symbol "public: __cdecl OFString::~OFString(void)" (??1OFString@@QEAA@XZ) referenced in function "private: void __cdecl MainWindow::tryDCMTK(void)" (?tryDCMTK@MainWindow@@AEAAXXZ)
1>mainwindow.obj : error LNK2019: unresolved external symbol "public: class OFCondition __cdecl DcmItem::findAndGetOFString(class DcmTagKey const &,class OFString &,unsigned long,bool)" (?findAndGetOFString@DcmItem@@QEAA?AVOFCondition@@AEBVDcmTagKey@@AEAVOFString@@K_N@Z) referenced in function "private: void __cdecl MainWindow::tryDCMTK(void)" (?tryDCMTK@MainWindow@@AEAAXXZ)
1>mainwindow.obj : error LNK2019: unresolved external symbol "public: __cdecl DcmFileFormat::DcmFileFormat(void)" (??0DcmFileFormat@@QEAA@XZ) referenced in function "private: void __cdecl MainWindow::tryDCMTK(void)" (?tryDCMTK@MainWindow@@AEAAXXZ)
1>mainwindow.obj : error LNK2019: unresolved external symbol "public: virtual __cdecl DcmFileFormat::~DcmFileFormat(void)" (??1DcmFileFormat@@UEAA@XZ) referenced in function "private: void __cdecl MainWindow::tryDCMTK(void)" (?tryDCMTK@MainWindow@@AEAAXXZ)
1>mainwindow.obj : error LNK2019: unresolved external symbol "public: class DcmDataset * __cdecl DcmFileFormat::getDataset(void)" (?getDataset@DcmFileFormat@@QEAAPEAVDcmDataset@@XZ) referenced in function "private: void __cdecl MainWindow::tryDCMTK(void)" (?tryDCMTK@MainWindow@@AEAAXXZ)
1>mainwindow.obj : error LNK2019: unresolved external symbol "public: virtual class OFCondition __cdecl DcmFileFormat::loadFile(char const *,enum E_TransferSyntax,enum E_GrpLenEncoding,unsigned long,enum E_FileReadMode)" (?loadFile@DcmFileFormat@@UEAA?AVOFCondition@@PEBDW4E_TransferSyntax@@W4E_GrpLenEncoding@@KW4E_FileReadMode@@@Z) referenced in function "private: void __cdecl MainWindow::tryDCMTK(void)" (?tryDCMTK@MainWindow@@AEAAXXZ)
1>C:\Users\Kriselle\documents\visual studio 2013\Projects\MainWindow\x64\Debug\\MainWindow.exe : fatal error LNK1120: 7 unresolved externals

Я просмотрел другие обсуждения: * Ссылка 1 ** говорит, что библиотеки должны быть связаны в свойствах-> компоновщик-> дополнительные библиотеки зависимостей. Я это уже сделал. Скриншоты моих дополнительных зависимостей библиотеки и переменных среды доступны в прикрепленном ниже zip-файле.

* Ссылка 2 ** имеет другой вывод ошибки. (Я это уже прошел). * Ссылка 3 ** гласит: «Ищите флаги / настройки компоновщика в диалоговом окне конфигурации проекта», но я не знаю, что не так с моими настройками компоновщика. Я даже перечислил библиотеки внутри каталога lib в моих дополнительных зависимостях. (Снимок экрана с моими дополнительными зависимостями также включен в zip-файл ниже.) Я также сделал то, что было предложено в * Ссылке 4 **. Более того, я считаю, что не совершил ту же ошибку, что и в * Ссылке 5 **, потому что у меня нет параметров для моей функции.

Изображения здесь: https://db.tt/CmpJndan ссылки на онлайн-обсуждения, которые я просмотрел, находятся здесь: https://db.tt/AOsewqUg

Как бы мне ни хотелось, чтобы вам было проще просматривать изображения и переходить по ссылкам, мне очень жаль, я могу разместить максимум две ссылки из-за отсутствия у меня репутации.

Помогите, пожалуйста. Большое спасибо за уделенное время!

РЕДАКТИРОВАТЬ: Я изменил порядок своих библиотек в соответствии с их зависимостями и добавил NetAPI32.lib и WSock32.lib в свои библиотеки благодаря ссылке, которую Ханс дал в комментариях. Но я все равно получаю те же ошибки.


person noobalert    schedule 03.07.2015    source источник
comment
Вы добавляли библиотеки в ту же конфигурацию (например, Debug / Release, Win32 / x64), что и та, которую вы пытаетесь скомпилировать?   -  person Serge Rogatch    schedule 03.07.2015
comment
Вам просто нужно связать больше библиотек, просто dcmdata недостаточно. Этот элемент часто задаваемых вопросов должен дать некоторое понимание.   -  person Hans Passant    schedule 04.07.2015
comment
@SergeRogatch Да. И всякий раз, когда я редактирую свойства, я всегда редактирую все конфигурации.   -  person noobalert    schedule 04.07.2015
comment
@HansPassant dcmdata была не единственной библиотекой, которую я связал. Вот скриншот моих дополнительных зависимостей: db.tt/TCz66gLE. Я посмотрел на ссылку, которую вы дали (кстати, спасибо), и изменил порядок моих библиотек в соответствии с их зависимостями, а также добавил NetAPI32.lib и WSock32.lib, но 7 ошибок все еще остались.   -  person noobalert    schedule 04.07.2015
comment
Так как же вы решили эту проблему? У меня такие же проблемы ...   -  person Engo    schedule 11.11.2015
comment
Думаю, я перенастроил DCMTK 3.6.1 в CMake, чтобы сделать его типом конфигурации x64. Думаю, я отключил DCMTK_OVERWRITE_WIN32_COMPILER_FLAGS в CMake.   -  person noobalert    schedule 11.11.2015
comment
@noobalert Не могли бы вы помочь мне настроить мой проект? Каждый раз, когда я исправляю несколько ошибок, я получаю новые ошибки :( Это очень важно, потому что это часть моей стажировки.   -  person Engo    schedule 12.11.2015
comment
Я считаю это прогрессом. Ха-ха. В любом случае, с какой ошибкой вы столкнулись сейчас? Раньше я сталкивался с ошибками LNK1104 и C1041.   -  person noobalert    schedule 12.11.2015
comment
Спасибо @noobalert за вопрос. Я выполнил все необходимые настройки в VS, но получал ошибку dcmdata.lib (dcuid.obj): error LNK2019: неразрешенный внешний символ _Netbios @ 4, указанный в функции unsigned char * __cdecl getMACAddress (unsigned char * const) (? GetMACAddress @@ YAPAEQAE @ Z). Я снова запустил Cmake, но ошибка не исчезла. Я не пробовал отключать DCMTK_OVERWRITE_WIN32_COMPILER_FLAGS, потому что на странице справки DCMTK указано, не отключайте, если вы действительно не знаете, что делаете. Вы можете помочь?   -  person Ruchir    schedule 23.11.2016
comment
Насколько я помню, я проигнорировал это сообщение, потому что я получаю ошибки, что бы я ни делал.   -  person noobalert    schedule 25.11.2016