罗朝辉(飘飘白云)

关注嵌入式操作系统,移动平台,图形开发。-->加微博 ^_^

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  85 随笔 :: 0 文章 :: 169 评论 :: 0 Trackbacks

在 iOS 平台上编译 DCMTK

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

CC 许可,转载请注明出处

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

我的编译环境:
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,按照如下图所示步骤执行:

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.5,然后点击 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 已经编译成功!

12,新建 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:

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

    }

 

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

 

posted on 2011-11-10 12:59 罗朝辉 阅读(8140) 评论(13)  编辑 收藏 引用 所属分类: Cocoa 开发医疗开发

评论

# re: [iOS]在 iOS 平台上编译 DCMTK 2011-11-12 00:01 攀升
有意思,我也要找时间研究下  回复  更多评论
  

# re: [iOS]在 iOS 平台上编译 DCMTK 2011-11-22 11:27 路人
你好,我在第十步编译失败,请问可以通过邮箱与您交流么?我的邮箱是406891663@qq.com  回复  更多评论
  

# re: [iOS]在 iOS 平台上编译 DCMTK 2011-11-22 20:23 罗朝辉
@路人

你确认你删除了步骤 9 中所有的非 lib 的 dependencies?  回复  更多评论
  

# re: [iOS]在 iOS 平台上编译 DCMTK 2011-12-27 23:24 路人
使用CMake 2.8.6编译dcmtk-3.6.1_20110922.tar.gz,可以顺利的生成xcode项目文件。打开时却提示:DCMTK.xcodeproj cannot be opened because the project file cannot be parsed。 你有遇到这种情况吗?  回复  更多评论
  

# re: [iOS]在 iOS 平台上编译 DCMTK 2011-12-28 12:24 罗朝辉
@路人

3.6.1 我没有试验过。。。  回复  更多评论
  

# re: [iOS]在 iOS 平台上编译 DCMTK 2012-02-13 22:47 polinzhuo
有上线软件吗,可以探讨一下。polinzhuo@163.com  回复  更多评论
  

# re: [iOS]在 iOS 平台上编译 DCMTK 2012-06-07 14:54 terran
我按照你的方法把库都编译好了(模拟器版本的和device版本的都编译成功了),在模拟器上面运行正常,但是编译到机器上面跑的时候链接新的 dcmtk 设备版库时候出了问题:
Undefined symbols for architecture armv7:
"__ZN13DcmFileFormatD1Ev", referenced from:
-[ViewController decodeStillImage:] in ViewController.o
"__ZN21DJDecoderRegistration7cleanupEv", referenced from:
-[ViewController decodeStillImage:] in ViewController.o
"__ZN13DcmFileFormat10getDatasetEv", referenced from:
-[ViewController decodeStillImage:] in ViewController.o
"__ZN21DJDecoderRegistration14registerCodecsE35E_DecompressionColorSpaceConversion13E_UIDCreation21E_PlanarConfigurationb", referenced from:
-[ViewController decodeStillImage:] in ViewController.o
"__ZN13DcmFileFormat8saveFileEPKc16E_TransferSyntax14E_EncodingType16E_GrpLenEncoding17E_PaddingEncodingjj15E_FileWriteMode", referenced from:
-[ViewController decodeStillImage:] in ViewController.o
"__ZN10DcmDataset20chooseRepresentationE16E_TransferSyntaxPK26DcmRepresentationParameter", referenced from:
-[ViewController decodeStillImage:] in ViewController.o
"__ZN10DiRegisterD1Ev", referenced from:
__GLOBAL__I_a in ViewController.o
"__ZN13DcmFileFormatC1Ev", referenced from:
-[ViewController decodeStillImage:] in ViewController.o
"__ZN8OFStringD1Ev", referenced from:
-[ViewController decodeStillImage:] in ViewController.o
"__ZN13DcmFileFormat8loadFileEPKc16E_TransferSyntax16E_GrpLenEncodingj14E_FileReadMode", referenced from:
-[ViewController decodeStillImage:] in ViewController.o
"__ZN10DicomImageC1EPKcmmm", referenced from:
-[ViewController decodeStillImage:] in ViewController.o
"__ZN10DiRegisterC1Ev", referenced from:
__GLOBAL__I_a in ViewController.o
"__ZN7DcmItem18findAndGetOFStringERK9DcmTagKeyR8OFStringmb", referenced from:
-[ViewController decodeStillImage:] in ViewController.o
"__ZN8OFStringC1Ev", referenced from:
-[ViewController decodeStillImage:] in ViewController.o
而且我也按照你说的把在 build setting 中设置 Other Linker Flags 为 /usr/lib/libz.dylib了还是有问题。
你知道这是怎么回事儿嘛?望指教,谢谢:)。
我的运行环境是xcode4.3.2 ios5.1
我的邮箱是terran_lang@hotmail.com。希望得到你的指教。  回复  更多评论
  

# re: [iOS]在 iOS 平台上编译 DCMTK 2012-08-26 22:46 leomay
@罗朝辉
删除第9步中的target dependencies会crash掉xcode,我用的是ios5.1,llvm-gcc编译器,谢谢  回复  更多评论
  

# re: [iOS]在 iOS 平台上编译 DCMTK 2012-09-18 15:59 谢云伟
我的qq是648098050,能加下吗?我实在不知道后续怎么做  回复  更多评论
  

# re: [iOS]在 iOS 平台上编译 DCMTK[未登录] 2012-11-03 11:00 jim
如何获取图像呢,我用savefile,一直是失败,什么问题呢,谢谢。  回复  更多评论
  

# re: [iOS]在 iOS 平台上编译 DCMTK 2014-07-22 17:41 owen263 at gmail.com
@路人 我的也是这种情况。求助。
  回复  更多评论
  

# re: [iOS]在 iOS 平台上编译 DCMTK 2014-08-18 15:05 lev
3.6.1DCMTK.xcodeproj cannot be opened because the project file cannot be parsed,qq:664394181,有没有人有同样问题 是什么问题啊?  回复  更多评论
  

# re: [iOS]在 iOS 平台上编译 DCMTK 2014-10-08 12:38 iOS
方便加我QQ么?编译成功 但是不能用其中的库函数。我的QQ1930401157  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理