Visual Studio 2022中DCMTK库编译出现libiconv未解析外部符号问题
在Visual Studio 2022中使用DCMTK库时遇到libiconv相关未解析外部符号问题
环境与配置说明
- 已获取DCMTK源码及「Visual Studio 2022 (MSVC 17.4) 64位,带"MT"选项的预编译支持库」
- 通过CMake生成VS项目并完成编译安装,已配置:
- VC++目录:包含目录、库目录指向DCMTK安装路径
- 链接器->输入的附加依赖项:
ofstd.lib oflog.lib Iphlpapi.lib ws2_32.lib wsock32.lib netapi32.lib dcmdata.lib dcmdsig.lib dcmnet.lib dcmsr.lib dcmimgle.lib dcmqrdb.lib dcmtls.lib dcmwlm.lib dcmpstat.lib dcmjpls.lib dcmjpeg.lib dcmimage.lib ijg8.lib ijg12.lib ijg16.lib i2d.lib zlib_d.lib
测试代码
#include <iostream> #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmimgle/dcmimage.h" using namespace std; int main(int argc, const char *argv[]) { string in_file = "C:\\Users\\windows\\Desktop\\CQ500CT0 CQ500CT0\\Unknown Study\\CT 4cc sec 150cc D3D on\\CT000000.dcm"; // Initialize DCMTK DcmFileFormat fileformat; OFCondition status = fileformat.loadFile("path_to_your_dicom_file.dcm"); if (status.good()) { // Access the dataset DcmDataset* dataset = fileformat.getDataset(); // Print some basic information OFString patientName; if (dataset->findAndGetOFString(DCM_PatientName, patientName).good()) { std::cout << "Patient's Name: " << patientName << std::endl; } else { std::cerr << "Error: cannot access Patient's Name!" << std::endl; } } else { std::cerr << "Error: cannot read DICOM file (" << status.text() << ")" << std::endl; } return 0; }
错误信息
Severity Code Description Project File Line Suppression State Details Error LNK1120 5 unresolved externals DicomTest C:\Users\windows\source\repos\DicomTest\x64\Release\DicomTest.exe 1 Error LNK2001 unresolved external symbol libiconv_open DicomTest C:\Users\windows\source\repos\DicomTest\DicomTest\ofstd.lib(ofchrenc.obj) 1 Error LNK2001 unresolved external symbol libiconv DicomTest C:\Users\windows\source\repos\DicomTest\DicomTest\ofstd.lib(ofchrenc.obj) 1 Error LNK2001 unresolved external symbol libiconv_close DicomTest C:\Users\windows\source\repos\DicomTest\DicomTest\ofstd.lib(ofchrenc.obj) 1 Error LNK2001 unresolved external symbol libiconvctl DicomTest C:\Users\windows\source\repos\DicomTest\DicomTest\ofstd.lib(ofchrenc.obj) 1 Error LNK2001 unresolved external symbol locale_charset DicomTest C:\Users\windows\source\repos\DicomTest\DicomTest\ofstd.lib(ofchrenc.obj) 1
已尝试操作
- 修改CMake配置中的
DCMTK_ENABLE_CHARSET_CONVERSION选项,分别测试默认的oficonv和libiconv值 - 指定
DCMTK_SUPPORT_LIBRARIES_DIR指向预编译支持库目录 - 指定libiconv-1.15路径并开启
DCMTK_WITH_ICONV选项
解决方案
1. 补充libiconv库依赖
当前附加依赖项缺少libiconv对应的库文件,需根据编译模式添加:
- Release MT模式:添加
libiconv.lib - Debug MT模式:添加
libiconv_d.lib
将其加入链接器->输入的附加依赖项列表即可。
2. 严格匹配编译模式一致性
确保测试项目与DCMTK编译/预编译库的模式完全对齐:
- 测试项目必须设置为多线程(/MT)(Release)或多线程调试(/MTd)(Debug),与预编译库的"MT"选项匹配
- 平台统一为x64,和预编译库位数一致
3. 修正CMake配置(自行编译DCMTK时)
若自行编译DCMTK,需确保:
- 当
DCMTK_ENABLE_CHARSET_CONVERSION设为libiconv时,DCMTK_WITH_ICONV必须开启,且ICONV_INCLUDE_DIR、ICONV_LIBRARY正确指向libiconv的头文件和库文件路径 - 生成项目时选择与测试项目一致的编译模式(Release/MT/x64)
4. 切换至oficonv模式
若不想依赖外部libiconv,将DCMTK_ENABLE_CHARSET_CONVERSION设为oficonv后重新编译DCMTK。该模式下DCMTK使用自带的字符转换实现,无需链接外部libiconv库,可直接解决未解析符号问题。
内容的提问来源于stack exchange,提问作者Dresult
相关产品推荐
相关产品推荐

