编译DCMTK

来源:互联网 发布:葛宝荣淘宝客 编辑:程序博客网 时间:2024/05/18 03:15
编译DCMTK
2008年09月11日 星期四 09:31
也许是DCMTK的开发人员认为DCMTK是一个专用的库,没有必要做成动态链接库。
   也许是DCMTK的开发人员认为DCMTK需要跨平台,做成动态链接库就平台相关了,违背了跨平台的本意。
    所以,如此两个也许只有,DCMTK经过编译之后总是得不到DLL文件。DCMTK到底能不能编译成DLL来使用呢?反正我是失败了。你来试试。不过在编译DCMTK的过程中也解决了不少棘手问题。不感独享。

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

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

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

结论三:
    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,"dcmimage")
         #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的维护完全可以安排一个专人负责。一般调试完毕之后,变化是很少的。如此以来,调试程序的时候,编译速度快多了