我知道这个问题已经被问过很多次了,但我很抱歉,我只是不知道我一直在做什么有什么问题。
我想要的是读取 DICOM 图像(按像素,因为我必须对其执行操作)并将其显示在 Qt GUI 上。
我有 Windows 8 和 Visual Studio 2013。我下载了 Qt 开源软件和 VS 的插件。我使用 cmake-gui 构建了 Qt。然后,我按照stackoverflow中题为“如何在Qt中使用DCMTK”的讨论中所说的话。我下载了 DCMTK 3.6.0,使用 cmake-gui 配置和生成它,在 VS 中构建了它的 ALL_BUILD 和 INSTALL 项目。至此,一切顺利。然后我尝试创建一个简单的程序来读取 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() {}
主窗口.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
主窗口.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
我查看了其他讨论: *Link 1** 说库必须在属性->链接器->附加库依赖项中链接。我已经这样做了。下面附加的 zip 文件中提供了我的其他库依赖项和环境变量的屏幕截图。
*Link 2** 有不同的错误输出。(我已经过去了)。*Link 3** 说“在项目配置对话框中查找链接器标志/设置”,但我不知道我的链接器设置有什么问题。我什至在我的附加依赖项中列出了 lib 目录中的库。(我的附加依赖项的屏幕截图也包含在下面的 zip 文件中。)我还完成了 *Link 4** 中的建议。此外,我相信我没有犯*Link 5** 中显示的相同错误,因为我的函数没有参数。
图片在这里:https ://db.tt/CmpJndan 我查看的在线讨论的链接在这里: https ://db.tt/AOsewqUg
尽管我想让您更轻松地查看图像并导航到链接,但非常抱歉,由于我缺乏声誉,我最多只能发布两个链接。
请帮我。非常感谢您的宝贵时间!
编辑:由于汉斯在评论中提供的链接,我根据它们的依赖关系更改了我的库的顺序,并将 NetAPI32.lib 和 WSock32.lib 添加到我的库中。但我仍然得到同样的错误。