文章目錄
- 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群?
互相交流
讀者你好!如果你對本文内容感興趣,我十分希望能夠和你互相學習,可以掃碼和我聯系!一起進步