【转】编译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的維護完全可以安排一個專人負責。一般調試完畢之后,變化是很少的。如此以來,調試程序的時候,編譯速度快多了。
總結
以上是生活随笔為你收集整理的【转】编译DCMTK的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成立以来年化增长怎么算收益?附计算案例!
- 下一篇: 腾讯游戏策划转身造车 轻橙时代VC官图发