天天看點

使用CMakeLists.txt導入dcmtk庫(不使用vs的工程)

文章目錄

  • ​​0 前言​​
  • ​​1 建構CMake工程步驟​​
  • ​​檔案樹​​
  • ​​CMakeLists.txt​​
  • ​​main.cpp​​
  • ​​使用​​
  • ​​2 資料​​
  • ​​使用其他基于dcmtk的庫​​
  • ​​論壇​​
  • ​​互相交流​​
  • ​​論壇​​
  • ​​互相交流​​

文章目錄

  • ​​0 前言​​
  • ​​1 建構CMake工程步驟​​
  • ​​檔案樹​​
  • ​​CMakeLists.txt​​
  • ​​main.cpp​​
  • ​​使用​​
  • ​​2 資料​​
  • ​​使用其他基于dcmtk的庫​​
  • ​​論壇​​
  • ​​互相交流​​
  • ​​論壇​​
  • ​​互相交流​​

0 前言

前面記錄了編譯好VS庫之後,利用Visual Studio來建構工程,也就是說有一個很大的.vs檔案夾以及.sln檔案來儲存工程的配置。

但是,CMake更為輕量,筆者不否認VS的強大,VS本身就可以打開CMake的工程。是以,本文,筆者使用CMake建構工程。可以利用CLIon或者還是VS來打開CMake的工程。

1 建構CMake工程步驟

​​一個很有用的英文參考資料​​

事實上,網絡關于利用CMake導入dcmtk庫的代碼相當少,基本沒有。也找到一些資料,但是過于複雜。

檔案樹

-CMakeLists.txt
-main.cpp
-README.md
─out
    └─build
        └─x64-Debug
            │  dcmdata.dll
            │  oflog.dll
            │  ofstd.dll
            │  testapp.exe      

其實隻需要​

​CMakeLists.txt​

​​和​

​main.cpp​

​​就可以,Readme.md就是你看到的這篇文章,而out是我用VS生成的,最終的testapp.exe就是可執行檔案,然後我們要把 ​

​dcmdata.dll​

​​和 ​

​oflog.dll​

​​和 ​

​ofstd.dll​

​放到和可執行檔案同一個目錄。

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
PROJECT(testapp)

SET(DCMTK_INCLUDE_DIRS "D:\\Programs\\dcmtkdll\\include")
SET(DCMTK_LIBRARIES "D:\\Programs\\dcmtkdll\\lib")
SET(DCMTK_DIR "D:\\Programs\\dcmtkdll")
#an example: SET(DCMTK_DIR "C:\\Users\\test\\test_dcmtk\\DCMTK")
#set(CMAKE_CXX_FLAGS -std=c++11)
# settings for Microsoft Visual C++ 6
SET(CMAKE_C_FLAGS "/nologo /W3 /GX /Gy /YX")
SET(CMAKE_C_FLAGS_DEBUG "/MTd /Z7 /Od")
SET(CMAKE_C_FLAGS_RELEASE "/MT /O2")
SET(CMAKE_CXX_FLAGS "/nologo /W3 /GX /Gy /YX")
SET(CMAKE_CXX_FLAGS_DEBUG "/MTd /Z7 /Od")
SET(CMAKE_CXX_FLAGS_RELEASE "/MT /O2")

ADD_DEFINITIONS(-D_REENTRANT)

INCLUDE_DIRECTORIES(${DCMTK_DIR}/include)
LINK_DIRECTORIES(${DCMTK_DIR}/lib)

ADD_EXECUTABLE(testapp main.cpp)
TARGET_LINK_LIBRARIES(testapp netapi32 wsock32 ofstd dcmdata)
message("-------------\n")
message("${DCMTK_INCLUDE_DIRS}")
message("${DCMTK_LIBRARIES}")
message(STATUS "${DCMTK_FOUND}")
#message("${DCMTK_INCLUDE_DIRS}")
message("${DCMTK_DIR}")
message(STATUS "-------------\n")      

main.cpp

// C++_Dicom_Sample.cpp : Defines the entry point for the console application.
//

//#include "stdafx.h"
//C++中stdafx.h的英文全稱為:standard application fram extend,中文名為:頭檔案預編譯。
//
//stdafx.h在c++中起到的作用是:把C++工程中使用的MFC頭檔案預先編譯,以後該工程編譯時,直接使用預編譯的結果,這樣可以加快編譯速度。

//#include "dcmtk/config/osconfig.h"
#include "dcmtk/dcmdata/dctk.h"
#include <iostream>


bool ReadPatientName(DcmFileFormat& fileformat, std::string& filePath)
{
    OFCondition status = fileformat.loadFile(filePath.c_str());
    if (!status.good())
    {
        std::cout << "Load Dimcom File Error: " << status.text() << std::endl;
        return false;
    }
    OFString PatientName;
    status = fileformat.getDataset()->findAndGetOFString(DCM_PatientName, PatientName);
    if (status.good())
    {
        std::cout << "Get PatientName:" << PatientName << std::endl;
    }
    else
    {
        std::cout << "Get PatientName Error:" << status.text() << std::endl;
        return false;
    }
    return true;
}

bool SavePatientName(DcmFileFormat& fileformat, std::string& filePath, const std::string& info)
{
    OFCondition status = fileformat.getDataset()->putAndInsertString(DCM_PatientName, info.c_str());
    if (status.good())
    {
        std::cout << "Save PatientName:" << info.c_str() << std::endl;
    }
    else
    {
        std::cout << "Save PatientName Error: " << status.text() << std::endl;
        return false;
    }

    status = fileformat.saveFile(filePath.c_str());
    if (!status.good())
    {
        std::cout << "Save Dimcom File Error: " << status.text() << std::endl;
        return false;
    }
    return true;
}

int main()
{
    DcmFileFormat dicomFileformat;

    std::string dicomFile = "image-00000.dcm";

    ReadPatientName(dicomFileformat, dicomFile);

    //SavePatientName(dicomFileformat, dicomFile, "John Snow");

    //ReadPatientName(dicomFileformat, dicomFile);

    system("pause");

    return 0;
}      

使用

其實隻需要​

​CMakeLists.txt​

​​和​

​main.cpp​

​​就可以,直接用VIsual Studio打開​

​CMakeLists.txt​

​,會生成out,然後複制那三個檔案。注意,現在因為我寫的CMakeLists的原因,隻能使用VS預設的編譯器,CLion預設打開運作會報錯。可能需要設定一下。

之後進行優化。

2 資料

從網上找的各種cmake工程的資料:

總感覺是我需要先把dcmtk編譯成一個可以用cmake調用的版本,然後CMake使用正确的代碼?

​​gitee​​

​​微信文章​​

​​2​​

​​3​​

​​4​​

​​5​​

使用其他基于dcmtk的庫

比如CTk就是對dcmtk的再利用,一個很好的輪子。可以從最基礎版本學?或者添加到我的代碼中?

​​CTK​​

​​slicer​​

​​MITK​​

[ITKSNAP]

論壇

論壇不用vpn才能順暢地浏覽:

總感覺這裡會有想要的答案,可惜無法搜尋。建個dcmtk群?

互相交流

讀者你好!如果你對本文内容感興趣,我十分希望能夠和你互相學習,可以掃碼和我聯系!一起進步

繼續閱讀