在 iOS 平臺上編譯 DCMTK
羅朝輝 (http://www.shnenglu.com/kesalin)
CC 許可,轉(zhuǎn)載請注明出處
DCMTK是德國 Offis 公司開發(fā)的實現(xiàn) DICOM 協(xié)議的跨平臺開源 C++庫,在醫(yī)學(xué)領(lǐng)域里是很有名的,它支持Windows ,Linux,Mac OS,SUN等平臺。不過貌似在 iOS 平臺上編譯 DCMTK 的文檔很少很少,折騰了好久終于編譯成功了,記錄下來。
我的編譯環(huán)境:
Mac OS 10.6
XCode 4.0.2
iOS SDK 4.3
1,首先下載最新的 DCMTK:http://www.dcmtk.org/,目前的版本為:dcmtk-3.6.0;
2,下載最新的 CMake:http://www.cmake.org/,安裝;
3,解壓 dcmtk 至 dcmtk-3.6.0,并新建目錄 dcmtk-xcode;
4,運行 CMake,按照如下圖所示步驟執(zhí)行:
4.1,設(shè)置 dcmtk 源文件目錄以及編譯目錄
4.2,點擊 Configure,在彈出的對話框中選中 XCode:
4.3,如果 configure 運行顯示 error, Don't worry!
4.4,配置 CMake 選項:
DOXYGEN : OFF
OPENSSL : OFF (optional : you need to have openssl libs for IOS)
PNG: OFF (optional)
PRIVATE_TAGS : ON (optional)
THREADS : OFF (optional)
TIFF : OFF (optional)
XML : OFF (optional)
ZLIB : ON (optional)
4.5,再次點擊 configure,運行,這次應(yīng)該沒有錯誤了;
4.5,然后點擊 generate,就會在 dcmtk-xcode 下生成名為 DCMTK.xcodeproj 的 xcode 工程。
5,打開 DCMTK.xcodeproj 工程,點擊工程名,查看 Build Setting,設(shè)置 Base SDK 為 Latest Mac OS(Mac OS 10.X),編譯 target 為 ALL_BUILD;
6,然后編譯運行,編譯時間很長,你可以去這里:http://code.google.com/p/ios-static-libraries/,下載編譯好的其他 lib for iOS,如 zlib,openssl 等。
7,編譯應(yīng)該沒有錯誤,如果報出找不到 libc.h,可以直接 comment 這一行,build again!
8,編譯成功之后,點擊工程名,查看 Build Setting,設(shè)置 Base SDK 為 Latest iOS(iOS x),設(shè)置 Architectures 為 Standard,設(shè)置 Build Active Architecture only 為 Yes;
9,修改 TARGETS 列表下 ALL_BUILD 的 Target Dependencies,將其下所有非 lib 的dependencies 刪除:
10,再次編譯 ALL_BUILD,如果沒有錯誤報出,恭喜 Dcmtk 已經(jīng)編譯成功!
12,新建 dcmtk 目錄,將相關(guān)的 include 和 .a lib 文件拷貝到對應(yīng)的目錄下,最終目錄結(jié)構(gòu)如下:
Copy dcmtk-3.6.0/XXX/include to dcmtk/include/dcmtk/XXX(except for config)
Copy dcmtk-xcode/include/dcmtk/config to dcmtk/include/dcmtk/config
Copy zlib.h to dcmtk/include/zlib.h
Copy dcmtk-xcode/XXX/libsrc/Debug-iphonePLATFORM/libXXX.a to dcmtk/lib-iphonePLATFORM/libXXX.a
Copy libz.a to dcmtk/lib-iphonePLATFORM/libz.a
include:
libs:
11,新建一個 iOS 應(yīng)用程序工程,將上面的文件夾拷貝到工程目錄下,設(shè)置工程的 Build Setting/Header Search Paths 為 PathToYourDcmtk/dcmtk/include,然后在工程 Target 的 Build Phases/Link Binary With Libraries 追加 libPlatform/*.a文件。
12,在某個.mm文件(ObjC與C++混編,可修改已有文件的后綴)中,導(dǎo)入頭文件,編寫代碼測試:
#include <dcmtk/dcmdata/dcfilefo.h>
#include <dcmtk/dcmdata/dcdeftag.h>
NSString *dcmFilename = @"/Users/luozhaohui/2.dcm";
DcmFileFormat fileFormat;
OFCondition loadStatus = fileFormat.loadFile([dcmFilename UTF8String]);
if (loadStatus.good())
{
OFString patientName;
OFCondition findStutas = fileFormat.getDataset()->findAndGetOFString(DCM_PatientName, patientName);
if (findStutas.good())
{
NSString *name = [NSString stringWithUTF8String:patientName.c_str()];
NSLog(@" >> %@ patient name is [%@]", dcmFilename, name);
}
}
else
{
NSLog(@" >> Failded to load %@!", dcmFilename);
}
13, 如果要在設(shè)備上運行,需要將 dcmtk 重新編譯一次 ios device 版本,然后鏈接新的 dcmtk 設(shè)備版庫。然后再編譯 app,這時如果出現(xiàn) “Undefined symbols for architecture armv7: "_inflateEnd"” 類似的錯誤,可以在 build setting 中設(shè)置 Other Linker Flags 為 /usr/lib/libz.dylib 即可。