модуль небезопасен для изображения SAFESEH C ++

87

Я использую Microsoft Visual Studio 2011 Professional Beta

Я пытаюсь запустить файлы OpenCV C ++ ( http://opencv.willowgarage.com/wiki/Welcome ), которые я скомпилировал с помощью cMake и Visual Studio Complier.

Однако когда я иду отлаживать проект, я получаю более 600 ошибок, большинство из которых:

ошибка LNK2026: модуль небезопасен для образа SAFESEH.

По-видимому, эти файлы находятся в проекте opencv_ffmpeg, но я не смог их найти. Я просмотрел страницу Safe Exception Handlers на странице справки Microsoft, но я не смог найти никаких окончательных ответов.

Мне было интересно, была ли у кого-нибудь еще эта проблема и удалось ли им ее исправить.

Аарон Томпсон
источник
12
Это происходит, когда вы связываете .obj или .lib, который содержит код, созданный более ранней версией компилятора. Что, конечно, было бы обычным явлением, если бы вы загрузили двоичный файл для opencv_ffmpeg вместо исходного кода. Вы можете отключить опцию компоновщика, но тогда у вас все равно будет несовместимость версии CRT, которая может быть байтовой. Восстановите библиотеку из исходного кода.
Ханс Пассан
Спасибо за помощь, это сработало
Аарон Томпсон
@HansPassant Что делать, если нет источника?
GregC
4
Очевидная вещь: попросите владельца кода предоставить вам обновление.
Ханс Пассан
@HansPassant Я надеюсь, что поставщик все еще готов сделать обновление. Звучит как проблема типа "фактор грузовика одного".
GregC

Ответы:

63

Из комментариев:

Это происходит, когда вы связываете .obj или .lib, который содержит код, созданный более ранней версией компилятора. Что, конечно, было бы обычным явлением, если бы вы загрузили двоичный файл для opencv_ffmpeg вместо исходного кода. Вы можете отключить опцию компоновщика, но тогда у вас все равно будет несовместимость версии CRT, которая может быть байтовой. Восстановите библиотеку из исходного кода. - Ханс Пассан, 15 мая в 13:01  
 
Спасибо за помощь, все получилось - Аарон Томпсон 17 мая в 14:50

Бо Перссон
источник
Это также может быть вызвано, как указано в сообщении об ошибке, модулями, для которых компоновщик не может найти безопасные обработчики исключений. В частности, модули языка ассемблера - как обсуждалось в других ответах. Существует некоторая информация об этом здесь .
Ник Вестгейт
148

Мне помогло отключение опции «Изображение имеет безопасные обработчики исключений» в свойствах проекта -> Свойства конфигурации -> Компоновщик -> вкладка «Дополнительно».

Женя
источник
3
На меня это не подействовало.
Pop-A-Stash
То же и для меня. Уловка, похоже, в том, что, хотя я могу выбрать SAFESEH: NO в подменю Advanced Options в настройках компоновщика, он не останется выбранным. Он всегда возвращается к БЕЗОПАСНОСТИ: ДА.
user382459
Успех с VS 2013 Express
gbarry 08
1
Success, VS 2015
2
Успех, VS 2017
ke4ktz
12

Если вы получили эту ошибку при создании ZLIB в Visual Studio, вот решение. Ищите contrib\masmx86\bld_ml32.batи добавляйте /safesehкак вариант

Перед

ml /coff /Zi /c /Flmatch686.lst match686.asm
ml /coff /Zi /c /Flinffas32.lst inffas32.asm

После

ml /safeseh /coff /Zi /c /Flmatch686.lst match686.asm
ml /safeseh /coff /Zi /c /Flinffas32.lst inffas32.asm
Наяна Адассурия
источник
У меня была такая же проблема с zlib, но .asmвместо этого мне пришлось изменить реквизиты файлов в проводнике решений.
Cillié Malan 04
11

Другой способ - добавить обработчик SEH (например, пустой) в файлы asm и скомпилировать их с /safesehопцией, а затем скомпилировать другой код обычно с /SAFESEH:YESопцией компилятора.

Пустой обработчик SEH:

.safeseh SEH_handler

SEH_handler   proc
;handler
ret

SEH_handler   endp
DitherSky
источник
1
Я не стал добавлять обработчик к стороннему источнику (zlib), /safesehкажется, достаточно. Это действительно должно быть одобрено!
mlt
2
Любой, у кого есть такие же проблемы с zlib, видит это (CTRL + F safeseh) tannerhelland.com/5076/compile-zlib-winapi-wapi-stdcall
codekiddy
Я добавил "/ safeseh" в командную строку в свойствах файла .asm, и это сработало.
Норберт Борос,
0

Ваш опыт может отличаться, но ни одно из приведенных выше предложений не помогло мне (хотя я не пробовал использовать собственный обработчик исключений asm).

Что действительно работало, так это выбор целевой сборки Release / x64.

Я запускаю Windows 10 на 64-битной машине и использую Visual Studio 2015.

Целевой Release / Win32 тоже работает. Думаю, главное - выбрать «Релиз».

Боб Стайн
источник