4

我在 Visual Studio 2013 下使用 DCMTK 库。如果我在项目的属性中设置

Character Set: Use Unicode Character Set

编译时出现错误

Error   1   error C2678: binary '+' : no operator found which takes a left-hand operand of type 'const wchar_t [8]' (or there is no acceptable conversion)   C:\DCMTK\include\dcmtk\oflog\tracelog.h
Error   2   error C2664: 'void dcmtk::log4cplus::Logger::forcedLog(const dcmtk::log4cplus::spi::InternalLoggingEvent &) const' : cannot convert argument 3 from 'int' to 'const char *'   C:\DCMTK\include\dcmtk\oflog\tracelog.h 
Error   3   error C2678: binary '+' : no operator found which takes a left-hand operand of type 'const wchar_t [8]' (or there is no acceptable conversion)   C:\DCMTK\include\dcmtk\oflog\tracelog.h
Error   4   error C2664: 'void dcmtk::log4cplus::Logger::forcedLog(const dcmtk::log4cplus::spi::InternalLoggingEvent &) const' : cannot convert argument 3 from 'int' to 'const char *'   C:\DCMTK\include\dcmtk\oflog\tracelog.h
Error   5   error C2665: 'dcmtk::log4cplus::Logger::getInstance' : none of the 2 overloads could convert all the argument types   C:\DCMTK\include\dcmtk\oflog\logmacro.h
IntelliSense: no instance of overloaded function "dcmtk::log4cplus::Logger::getInstance" matches the argument list
            argument types are: (const dcmtk::log4cplus::tchar *)   c:\DCMTK\include\dcmtk\oflog\logmacro.h
IntelliSense: no operator "+" matches these operands
            operand types are: const wchar_t [8] + dcmtk::log4cplus::tstring   c:\DCMTK\include\dcmtk\oflog\tracelog.h
IntelliSense: no operator "+" matches these operands
            operand types are: const wchar_t [8] + dcmtk::log4cplus::tstring   c:\DCMTK\include\dcmtk\oflog\tracelog.h
IntelliSense: identifier "cerr" is undefined   c:\Users\Kyle\Google Drive\cpp_codes\dicom\DicomTest\test1\Source.cpp
IntelliSense: identifier "endl" is undefined   c:\Users\Kyle\Google Drive\cpp_codes\dicom\DicomTest\test1\Source.cpp

如果我设置我可以解决Character Set: Use Multi-Byte Character Set

但我需要在字符集必须为 Unicode 的另一个项目中使用 DCMTK。查看错误,问题仅存在于关于日志的某些类中,可能我永远不会使用:所以我尝试注释出现错误的代码行,现在我可以使用 Unicode 进行编译。

这是解决问题的独特方法吗?我可以评论那部分有什么问题?

4

2 回答 2

2

根据 DCMTK 的安装文件:

“当定义 UNICODE 或 _UNICODE 时,DCMTK 不会编译,因为 VisualStudio 编译器随后对所有 Windows API 函数使用 Unicode 版本而不是 ANSI 版本(即,对于所有字符串参数和返回值,键入 wchar_t 而不是 char)。”

也许,您应该将 DCMTK 与动态链接(作为 DLL)一起使用。但是,这需要使用当前的开发快照,而不是最新版本(即 3.6.0)。

于 2015-02-12T18:36:47.040 回答
1

我遇到了同样的问题。该线程已有几天历史,但也许有人可以使用此信息。我发现了一些有类似问题的线程,但没有令人满意的解决方案。

我们有一个问题,我们想将 IDE 从 VS2008 更改为 VS2015。我们软件解决方案的所有(子)项目都是使用 UNICODE 标志构建的。我们之前已经成功地将 DCMTK 3.6.1 集成到 UNICODE 项目中。

我下载了最新的DCMTK 3.6.1版本(3.6.1_20161102)并用 VS2015 编译它。然后我尝试将静态库链接并编译到我们的软件解决方案,但这失败了(与上述相同的错误)。

在使用静态库、不同的 CMake 设置和共享库建议(也使用一个完整的共享 DCMTK 库)尝试数小时不成功后,我尝试了另一种方法。因为有了 VS2008 IDE 和 UNICODE,它已经可以工作了。

最后我成功了,因为我使用了较旧的DCMTK 3.6.1版本(3.6.1_20120222)。

DCMTK 3.6.1 (20120222)

此构建不包含以下文件:

dcmtk\oflog\tracelog.h

当为目标项目设置 UNICODE 标志时,此文件会导致(在我的情况下)编译器和链接器错误。

此外,当标志DCMTK_OVERWRITE_WIN32_COMPILER_FLAGS被激活时,我收到如下错误:

1>dcmnet.lib(assoc.obj):错误 LNK2038:检测到“RuntimeLibrary”不匹配:值“MTd_StaticDebug”与 DCMBase.obj 中的值“MDd_DynamicDebug”不匹配

没有标志,我可以毫无问题地使用编译的静态库。

希望这可以帮助某人并节省很多时间。

问候

于 2016-12-16T16:30:43.587 回答