Ошибка Unicode набора символов DCMTK

Я использую библиотеку DCMTK в Visual Studio 2013. В свойствах проекта, если я установил

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

Но мне нужно использовать DCMTK в другом проекте, где набор символов должен быть Unicode. Глядя на ошибку, проблема только в каком-то классе журнала, который, вероятно, я никогда не буду использовать: поэтому я пытаюсь прокомментировать строку кода, в которой появляется ошибка, и теперь я могу скомпилировать с Unicode.

Это единственный способ решить проблему? Какая проблема у меня может возникнуть, комментируя эту часть?


person GiordiX    schedule 23.01.2015    source источник
comment
С технической точки зрения параметр компилятора набора символов - это параметр для каждого файла, поэтому вы можете просто изменить это. Но тогда, возможно, остальная часть проекта запутается из-за смешанных объявлений и взорвется другим способом ...   -  person rodrigo    schedule 23.01.2015


Ответы (2)


Согласно INSTALL-файлу DCMTK:

«DCMTK не компилируется, если определен UNICODE или _UNICODE, потому что компилятор VisualStudio затем использует версию Unicode вместо версии ANSI для всех функций Windows API (т.е. введите wchar_t вместо char для всех параметров символьной строки и возвращаемых значений)».

Возможно, вам стоит использовать DCMTK с динамической компоновкой (как DLL). Однако для этого необходимо использовать текущий моментальный снимок разработки, а не последнюю версию (3.6.0).

person J. Riesmeier    schedule 12.02.2015

У меня точно такая же проблема. Этой теме несколько дней, но, возможно, кто-то сможет использовать эту информацию. Я нашел несколько тем с похожей проблемой, но без удовлетворительного решения.

У нас возникла проблема, заключающаяся в том, что мы хотим изменить 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» не соответствует значению «MDd_DynamicDebug» в DCMBase.obj

Без флага я мог без проблем использовать скомпилированные статические библиотеки.

Надеюсь, это поможет кому-то и сэкономит много часов.

С Уважением

person gwythyr    schedule 16.12.2016