【转】编译DCMTK

转自:https://blog.51cto.com/u_2845385/1053291

也许是DCMTK的开发人员认为DCMTK是一个专用的库,没有必要做成动态链接库。 
也许是DCMTK的开发人员认为DCMTK需要跨平台,做成动态链接库就平台相关了,违背了跨平台的本意。
       正因为这两个"也许",造成DCMTK经过编译之后总是得不到DLL文件。DCMTK到底能不能编译成DLL来使用呢?反正我是失败了。你来试试。不过在编译DCMTK的过程中也解决了不少棘手问题。不感独享。

    我用的编译环境是VC8(就是VS2005)里面的VC。我们编译的目的是使DCMTK能和我们现在使用的MFC良好协作。我们学习都是螺旋渐进式学习的(提出结论,然后推翻结论,得出新结论),我们也这样,并得到了以下结论。

结论一、只能使用MBCS字符集:
    使用VC编写程序,总是离不开字符串,需要使用字符串CString。而VC呢?又支持各种不同的字符串编码。那么CMake创建的DCMTK项目,里面默认的什么字符串编码呢?好象VC8向导创建的项目,默认就是Unicode,而不是MBCS哦。正好相反,需要注意。CMake创建的DCMTK项目里面都使用的MBCS字符集。那么以后使用VC编写DCMTK应用程序的时候,还是使用MBCS字符集吧。毕竟DCMTK太大了,修改起来不太方便。以后,我们就不讨论Unicode版本的应用程序啦,只考虑使用MBCS的应用程序。

结论二、只能编译成静态连接库
    DCMTK只能编译成静态连接库。
    为什么呢?因为我们按照默认的办法编译DCMTK之后,找不到任何DLL文件。全部是一大堆的LIB文件和.H文件。

结论三、需要C语言运行库
    VC书写的程序都需要使用C语言运行库(里面实现了标准的C语言函数哦,比如IOSTREAM等东西)。

结论四:
    C语言运行库的引如方式有两种。与MFC的用法一样,有动态链接的方式和静态链接的方式。也就是编译参数/MT /MTd /MD /MDd负责控制啦。
    /MT负责链接发行版的C语言运行库(静态链接)。
    /MTd负责链接调试版的C语言运行库(静态链接)。
    /MD负责链接发行版的C语言运行库(动态链接)。
    /MDd负责链接调试版的C语言运行库(动态链接)。
    
    我们都知道动态链接MFC的时候,应用程序运行时会要求提供MFC对应的DLL。
    VC6的需要MFC4.2的DLL。调试版的程序会自动引入MFC42D.DLL。发行版的会自动引入MFC42.DLL。MFC42U.DLL呢?(那是Unicode版本的MFC,前面都说啦,不讨论了)。VC8提供的DLL形式的MFC又是另外一个模样,叫做MFC80.DLL。

结论五、静态链接方式链接语言运行库
DCMTK使用的是静态链接方式链接语言运行库。使用默认的DCMTK编译参数,生成的LIB文件。在使用的时候,需要注意以下问题。
    ①需要设置项目的字符类型为MBCS,可以判断有没有定义文本宏_MBCS;
    ②需要设置项目使用语言运行库的方法为静态链接,可以判断有没有定义文本宏(_MDd,_MD,_MT,MTt);
    ③需要静态链接MFC,可以判断有没有定义文本宏(_AFXDLL);
    ④需要链接很多库,可以通过在源文件中编写代码实现, 提高重用度

        #pragma comment(lib,"ofstd")
        #pragma comment(lib,"dcmdata")
        #pragma comment(lib,"dcmtls")
        #pragma comment(lib,"dcmnet")
        #pragma comment(lib,"dcmqrdb")
        #pragma comment(lib,"dcmimgle")
        #pragma comment(lib,"dcmp_w_picpath")
        #pragma comment(lib,"dcmjpeg")
        #pragma comment(lib,"ijg8")
        #pragma comment(lib,"ijg12")
        #pragma comment(lib,"ijg16")
        #pragma comment(lib,"dcmdsig")
        #pragma comment(lib,"dcmsr")
        #pragma comment(lib,"dcmpstat")
        #pragma comment(lib,"dcmwlm")
        #pragma comment(lib,"netapi32")
        #pragma comment(lib,"wsock32")

    。

结论六、独立性和完整性都最好
    按照结论五编写出来的应用程序是很大的。但是独立性和完整性都最好。我写了个简单的Demo。调试版的大小是4.05M,发行版的大小是1.10M。但是复制到什么地方都可以运行,根本不需要其它额外的动态连接库。

 结论七:
    有时必须调整DCMTK链接语言运行库的方式(变静态链接为动态链接)。
    比如,要写扩展MFC的DLL时,就必须采用动态链接的方式使用MFC。VC要求,采用动态链接的方式使用MFC就必须采用用动态链接的方式使用语言库。如果DCMTK采用静态方式链接语言库,使用DCMTK的程序采用动态方式链接,那么就会出现语言库中的符号符号重复定义的情况。怎么办呢?能不能在最后链接的时候在统一指定语言库的使用方式呢?这个我测试了,好象不行。哪位大侠搞定了通知我下。我采用的办法是重新编译DCMTK。修改其语言库链接方式。如何操作呢?
    替换所有CMakeLists.txt中的/MT为/MD (根据经验其实也就根目录下的CMakeLists.txt中存在)。重新编译DCMTK。这样一来,我们的程序就可以采用动态链接的方式使用MFC了。 
    这次编译出来的程序,大小还可以。我把需要用到的功能用MFC扩展的DLL进行了包装。调试版本的DCMTK.DLL大小为1.92M;发行版本的DCMTK.DLl大小为884K;调试版本的Demo.EXE文件大小为152K;发行版本的Demo.EXE大小为48K。其实DCMTK.DLL的维护完全可以安排一个专人负责。一般调试完毕之后,变化是很少的。如此以来,调试程序的时候,编译速度快多了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WinCE6下的kernelIoControl使用方法

WinCE6下的kernelIoControl可不是谁都可以调的。 这个可能很多人曾经知道,但是老是忘记,比如我,哈哈。 kerneliocontrol以前在CE5下面耍惯了,用这个接口,AP简直可以无法无天啊,动不动就reset你&#xff0…

Flex 学习随笔 ---- 使用WebService 与数据库连接

任何一个网络工具, 如果不能和数据打交道,那它就是失败的。 还好Flex是可以的,由于本人刚学,就用asp.netc#来讲下这个简单的连接。 Flex 和数据库通讯现在只能使用Service,如httpservice,rpcservice,webservice等等。 …

第三方登录android代码,Android Learning:微信第三方登录(示例代码)

这两天,解决了微信第三方授权登录的问题,作为一个新手,想想也是一把辛酸泪。我想着,就把我的遇到的坑给大家分享一下,避免新手遇到我这样的问题能够顺利避开。步骤一 微信开发者平台我开始的解决思路是,去这…

【转】基于DCMTK的DICOM相关程序编写攻略

转自:https://blog.csdn.net/jackmacro/article/details/5332654 零、前言: 由于现在的医学影像设备的图像存储和传输正在逐渐向DICOM标准靠拢,因此,我们在进行医学图像处理的过程中,经常需要自己编写和DICOM格式的图…

对象与函数

摘自《UMLOOPC嵌入式C语言开发精讲》 11.3 对象与函数11.3.1 函数的角色经济诺贝尔奖得主H.A.Simon(H.A.Simon,计算机人工智能之父)在其1962年的文章《The Architecture of Complexity》中说道:“从小系统建造成庞大系统时&…

android打包工具多渠道批量打包,Android 快速渠道批量打包详解教程-美团多渠道打包方案...

今天写一篇文章来总结下android批量打渠道包美团版本。之前项目上一直用的是gradle 批量打包方式,那个速度啊真是令人发指,15个渠道得跑上半个小时,出去吃顿饭回来,还在跑。特别是赶上项目上线的话,如果给测试提交了正…

【转】云社区 博客 博客详情 二维异形件排版算法介绍(一)

转自:https://bbs.huaweicloud.com/blogs/175385 【摘要】 排样问题(Nesting Problem)又称为下料问题(Cutting and stock problems)或填充问题(Packing Problem),其目标是在材料切割过程中寻找一个较高的材料利用率。排样问题属于…

增加RIL组件时编辑出现的问题

当我把RIL组件加进到CE6的项目里去编译,本来好好的项目编译不过去了,我就选择了RIL的所有feature,没有改任何东西,理论上sysgen就可以了,但是确总是编译不过去 看根目录下的build.log: E:/WINCE600/OSDesigns/POS410/POS410/Wince600/E6000_ARMV4I/cesy…

android 微信两个服务的,微信上线两个新功能

微信又上线新功能了!一个与你的钱包相关,一个与你的微信号相关,赶紧来看看吧微信支付分全面开放每个微信用户都拥有自己的一个分数值 ,且每月根据综合数据更新一次。达到一定的分值门槛,用户即可享受超千项便捷服务。这…

【转】二维异形件排版算法介绍(二)

转自:https://bbs.huaweicloud.com/blogs/196289【摘要】 二维不规则异形件主要有两种策略:分别是基于可行解的排样策略和基于重叠移除的排样策略。所谓基于可行解的排样策略,是指在排样过程中零件之间始终是不重叠的,而基于重叠移…

解决用户控件循环引用的笨办法

在上一篇中提到使用MagicAjax开发了一个项目,因为做这个项目之前对MagicAjax不是很了解,在里面使用了用户控件,我发现这是一个很致命的错误,用户控件在MagicAjax中用起来很痛苦.因我们的项目不是简单的只要求"看起来像"没有刷新页面,其中一个主要的页面有那么一点点复…

【转】介绍一些免费/开源的医学影像后处理工具

转自:https://blog.csdn.net/liaopiankun0618/article/details/84328331 来源:融视影像科技 综述 医学影像的处理有两个特质。一是复杂,整个处理流程涉及多种算法,需要调整的参数较多。二是发展快,从采集、重建到后…

android 安卓市场,安卓市场(Android Market).doc

安卓市场(Android Market)安卓市场(Android Market)Android (HiMarket) China market is the earliest and largest Android software and online game download platform, Netdragon well-known products, provide good service for users of mobile phone software. Since it…

IROM 浅见

IROM其实是三星已经固化在CPU里面的一段代码,我们要做的事情就是提供一段可以供IROM读取的8K代码程序,至于这8K代码放在哪里,由CPU的相关引脚决定(OM1-OM4,GPN13-GPN15)。也就是说从哪里启动的意思。 如果从…

LINQ是死是活?——很奇怪为什么会有这样的话题?

LINQ是死是活??? 如果我问您:机器代码死了吗?汇编死了吗?C死了吗?VB6.0死了吗?Delphi死了吗?您可能会觉得我很无聊。所以我觉得“LINQ是死是活”的说法也很奇怪? LINQ诞…

android gradle 语法,Gradle 1.语法

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?gradle 语法解析:gradle的语法十分简洁,以至于看起来跟像是配置文件。先看一个简单的android项目完整的gradle脚本:build.gradle123456789101112131415…

【转】二维异形件排版算法介绍(三)

转自:https://bbs.huaweicloud.com/blogs/203947 【摘要】 相比于基于可行解的排样算法,重叠移除算法在改变解的状态时,允许零件之间发生重叠,然后采用分离技术消除重叠,直到达到算法的终止条件为止。重叠移除算法的关…

WinCE6.0中应用程序如何直接访问物理空间

在实际开发过程中,经常希望能在应用程序中直接读写设备的物理空间。以前在做WinCE6.0下的MEMMgr时通过秘密加载一个内核态驱动实现了这个需求。但这种方式有一个明显的缺陷,每次读写都必须经由它才能完成。如果只是读取GPIO,那问题不算大。如…

开博之文

逛园子很久了,读而不写非礼也。分享技术,交流经验,体味人生,本博主旨,此为09年的开年大事。转载于:https://www.cnblogs.com/imstand/archive/2009/01/11/1373712.html

【转】Dicom格式文件解析器!!!!!!!

转自:https://www.cnblogs.com/assassinx/archive/2013/01/09/dicomViewer.html Dicom全称是医学数字图像与通讯,这里讲的暂不涉及通讯的问题 只讲*.dcm 也就是diocm格式文件的读取,读取本身是没啥难度的 无非就是字节码数据流处理。只不过确…