如何自行解决Visual Studio中的LNK2019错误(DCMTK开发场景)
作为常年和DCMTK打交道的开发者,太懂每次遇到LNK2019就疯狂谷歌找库的痛苦了。其实掌握几个实用技巧,完全可以自己搞定依赖库定位,针对你用VS2015的场景,分享几个靠谱方法:
1. 从DCMTK模块对应关系入手
DCMTK的头文件和库文件是严格按模块划分的,你用到的头文件基本能直接对应到需要链接的库:
- 你包含的
<dcmtk\dcmdata\...>头文件,对应dcmdata.lib(Debug版是dcmdatad.lib) <dcmtk\dcmjpeg\...>对应dcmjpeg.lib(Debug版dcmjpegd.lib)<dcmtk\dcmjpls\...>对应dcmjpls.lib(Debug版dcmjplsd.lib)
另外,DCMTK所有模块几乎都依赖基础库:ofstd.lib(Debug版ofstdd.lib)和oflog.lib(Debug版oflogd.lib),这俩别漏加。
2. 拆解LNK2019错误中的未定义符号
VS输出的LNK2019错误里,会明确给出未定义的函数/类名,比如类似:
error LNK2019: unresolved external symbol "public: __thiscall DcmDataset::DcmDataset(void)" (??0DcmDataset@@QAE@XZ) referenced in function _main
你可以把符号中的类名(比如DcmDataset)对应到头文件,再定位所属模块:
- 打开
DcmDataset所在的dcdatset.h,看路径是dcmdata目录下,那肯定要链接dcmdata模块的库。 - 如果是JPEG相关类(比如
DJDecoder),就在dcmjpeg模块,对应dcmjpeg.lib。
3. 用VS自带工具定位符号
在VS2015中,右键点击错误列表里的未定义符号,选择「查找符号」→「在文件中查找」,就能定位到该符号所在的库文件(前提是你已经把DCMTK的库目录添加到VS的「库文件搜索路径」里)。
4. 参考DCMTK源码的CMake配置
DCMTK每个模块的源码目录下都有CMakeLists.txt,比如dcmdata、dcmjpeg目录里的配置文件,会明确该模块生成的库名,以及它依赖的其他库。比如dcmjpeg模块的CMake配置里会写依赖dcmdata、ofstd,这样你就知道除了dcmjpeg.lib,还要链接这些依赖库。
针对你当前代码的具体依赖
你用到了dcmdata、dcmjpeg、dcmjpls模块,Debug模式下需要链接的库列表:
ofstdd.lib oflogd.lib dcmdatad.lib dcmjpegd.lib dcmjplsd.lib
Release模式把每个库名末尾的d去掉即可。
最后提醒:DCMTK的Debug和Release库一定要和你的项目配置严格对应,不然也会触发链接错误哦!
内容的提问来源于stack exchange,提问作者WtDMaO

