网站集约化建设做法,常州做网上废品收购网站,什么专业学网页设计制作,为什么网站浏览不是做的那样转自#xff1a;https://blog.51cto.com/u_2845385/1053291
也许是DCMTK的开发人员认为DCMTK是一个专用的库#xff0c;没有必要做成动态链接库。 也许是DCMTK的开发人员认为DCMTK需要跨平台#xff0c;做成动态链接库就平台相关了#xff0c;违背了跨平台的本意。 …转自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的维护完全可以安排一个专人负责。一般调试完毕之后变化是很少的。如此以来调试程序的时候编译速度快多了。