[Cocoa,医疗]在iOS平台上编译DCMTK

在iOS平台上编译 DCMTK

罗朝辉 (http://www.cnblogs.com/kesalin/)

本文遵循“署名-非商业用途-保持一致”创作公用协议

DCMTK是德国 Offis  公司开发的实现 DICOM 协议的跨平台开源 C++库,在医学领域里是很有名的,它支持Windows ,Linux,Mac OS,SUN等平台。不过貌似在 iOS 平台上编译 DCMTK 的文档很少很少,折腾了好久终于编译成功了,记录下来。

我的编译环境:
Mac OS 10.6
XCode 4.0.2
iOS SDK 4.3

后记:iOS 5 无论是 simulator 还是 device 编译也都可以顺利通过。

 

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,按照如下图所示步骤执行:

4.1,设置 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,运行,这次应该没有错误了;

4.6,然后点击 generate,就会在 dcmtk-xcode 下生成名为 DCMTK.xcodeproj 的 xcode 工程。

 

5,打开 DCMTK.xcodeproj 工程,点击工程名,查看 Build Setting,设置 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,编译应该没有错误,如果报出找不到 libc.h,可以直接 comment 这一行,build again!

 

8,编译成功之后,点击工程名,查看 Build Setting,设置 Base SDK 为 Latest iOS(iOS x),设置 Architectures 为 Standard,设置 Build Active Architecture only 为 Yes;

 

9,修改 TARGETS 列表下 ALL_BUILD 的 Target Dependencies,将其下所有非 lib 的dependencies 删除:

 

10,再次编译 ALL_BUILD,如果没有错误报出,恭喜 Dcmtk 已经编译成功!

 

11,新建 dcmtk 目录,将相关的 include 和 .a lib 文件拷贝到对应的目录下,最终目录结构如下:

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:

 

12,新建一个 iOS 应用程序工程,将上面的文件夹拷贝到工程目录下,设置工程的 Build Setting/Header Search Paths 为 PathToYourDcmtk/dcmtk/include,然后在工程 Target 的 Build Phases/Link Binary With Libraries 追加 libPlatform/*.a文件。

 

13,在某个.mm文件(ObjC与C++混编,可修改已有文件的后缀)中,导入头文件,编写代码测试:

#include <dcmtk/config/osconfig.h>
#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);
}


14, 如果要在设备上运行,需要将 dcmtk 重新编译一次 ios device 版本,然后链接新的 dcmtk 设备版库。然后再编译 app,这时如果出现  “Undefined symbols for architecture armv7:   "_inflateEnd"” 类似的错误,可以在 build setting 中设置 Other Linker Flags 为 /usr/lib/libz.dylib 即可。

posted @ 2011-11-10 12:41  飘飘白云  阅读(1222)  评论(0编辑  收藏  举报
本博客遵循 Creative Commons License “署名-非商业用途-保持一致”创作共用协议。 与我联系