Странное различие между Debug и Release, приводящее к неразрешенной _except_handler3, или Почему, о, почему я не знаю о libcmtd?
Приложение для Windows, над которым я работал, должно быть доставлено без использования CRT. Есть несколько хороших статей, описывающих руководящие принципы и преимущества этого (ни одной из которых я не смог найти при написании этого вопроса - извините) . В противном случае явно не используются символы CRT, все дело в конфигурации компоновщика и компилятора. Мои конфигурации Release и Debug теперь почти идентичны, и обе указывают /NODEFAULTLIB:"LIBCMT"
только diffrence - флаг времени выполнения /MT
(в версии) против /MTd
(в Debug) - это требуется, поскольку я использую __try/__except
синтаксис для SEH
и поэтому единственная необходимая функция _except_handler3()
, Тем не менее, версия Debug успешно собирается, а версия Release терпит неудачу с Unresolved Symbol _except_handler3
ошибка связи. При принудительной компиляции версии Release /MTd
- эта проблема решена.
Как это возможно? который .lib
содержит экспорт _except_handler3? и как я могу решить это?
1 ответ
Для приложения без CRT см.: http://blog.kalmbach-software.de/2008/02/02/smallest-application-size-for-win32-console-application/
Но если вы хотите использовать __try / __except, вам нужно использовать CRT; или вам нужно написать свой собственный "_except_handler3".
Смотрите также: _except_handler3
Также у вас есть источник CRT, и вы можете взглянуть на источник, чтобы увидеть, что он делает! См.: C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\crt\src