módulo inseguro para SAFESEH imagen C ++

87

Estoy usando Microsoft Visual Studio 2011 Professional Beta

Estoy intentando ejecutar los archivos OpenCV C ++ ( http://opencv.willowgarage.com/wiki/Welcome ) que he compilado con cMake y Visual Studio Complier.

Sin embargo, cuando voy a depurar el proyecto, obtengo más de 600 errores, la mayoría de ellos:

error LNK2026: módulo inseguro para la imagen SAFESEH.

Aparentemente, estos archivos están en el proyecto opencv_ffmpeg pero no pude encontrarlos, he echado un vistazo a la página Safe Exception Handlers de la página de ayuda de Microsoft, pero no pude encontrar ninguna respuesta definitiva.

Me preguntaba si alguien más ha tenido este problema y si lograron solucionarlo.

Aaron Thompson
fuente
12
Esto sucede cuando vincula un .obj o .lib que contiene código creado por una versión anterior del compilador. Lo cual, por supuesto, sería común si descargara un binario para opencv_ffmpeg en lugar de la fuente. Puede desactivar la opción del vinculador, pero aún tendrá una incompatibilidad de versión CRT que puede omitir. Reconstruya la biblioteca desde la fuente.
Hans Passant
Gracias por la ayuda, funcionó
Aaron Thompson
@HansPassant ¿Qué hacer cuando no hay fuente?
GregC
4
Lo obvio: pídale al propietario del código que le proporcione una actualización.
Hans Passant
@HansPassant Espero que el proveedor todavía esté disponible para hacer una actualización. Suena como un problema del tipo "factor de camión de uno".
GregC

Respuestas:

63

De los comentarios:

Esto sucede cuando vincula un .obj o .lib que contiene código creado por una versión anterior del compilador. Lo cual, por supuesto, sería común si descargara un binario para opencv_ffmpeg en lugar de la fuente. Puede desactivar la opción del vinculador, pero aún tendrá una incompatibilidad de versión CRT que puede omitir. Reconstruya la biblioteca desde la fuente. - Hans Passant 15 de mayo a las 13:01  
 
Gracias por la ayuda, funcionó - Aaron Thompson 17 de mayo a las 14:50

Bo Persson
fuente
También puede deberse, como indica el error, a módulos para los que el vinculador no puede encontrar controladores de excepciones seguros. Módulos de lenguaje ensamblador en particular, como se discutió en otras respuestas. Hay algo de información sobre esto aquí .
Nick Westgate
148

La desactivación de la opción "La imagen tiene controladores de excepciones seguros" en las propiedades del proyecto -> Propiedades de configuración -> Vinculador -> pestaña Avanzado me ayudó.

Zhenya
fuente
3
Esto no tuvo ningún efecto para mí.
Pop-A-Stash
Lo mismo para mí. El problema parece ser que, aunque puedo elegir SAFESEH: NO en el submenú Opciones avanzadas en la configuración del enlazador, no permanecerá elegido. Siempre vuelve a SAFESEH: SÍ.
user382459
Éxito, con VS 2013 Express
gbarry
1
Éxito, VS 2015
2
Success, VS 2017
ke4ktz
12

Si recibió este error al compilar ZLIB en Visual Studio, aquí está la solución. Buscar contrib\masmx86\bld_ml32.baty agregar /safesehcomo opción

antes de

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

Después

ml /safeseh /coff /Zi /c /Flmatch686.lst match686.asm
ml /safeseh /coff /Zi /c /Flinffas32.lst inffas32.asm
Nayana Adassuriya
fuente
Tuve el mismo problema con zlib, pero tuve que cambiar los accesorios en los .asmarchivos en el explorador de soluciones.
Cillié Malan
11

Otra forma es agregar algún controlador SEH (vacío, por ejemplo) a los archivos asm y compilarlos con la /safesehopción, luego compilar otro código normalmente con la /SAFESEH:YESopción del compilador.

Manipulador SEH vacío:

.safeseh SEH_handler

SEH_handler   proc
;handler
ret

SEH_handler   endp
DitherSky
fuente
1
No me molesté en agregar un controlador a la fuente de terceros (zlib), /safesehparece suficiente. ¡Esto realmente debería ser votado a favor!
2015
2
Cualquiera que tenga los mismos problemas con zlib vea esto (CTRL + F safeseh) tannerhelland.com/5076/compile-zlib-winapi-wapi-stdcall
codekiddy
Agregué "/ safeseh" a la línea de comando en las propiedades del archivo .asm y esto funcionó.
Norbert Boros
0

Su kilometraje puede variar, pero ninguna de las sugerencias anteriores funcionó para mí (aunque no intenté usar mi propio controlador de excepciones ASM).

Lo que sí funcionó fue seleccionar la versión de destino de compilación / x64.

Estoy ejecutando Windows 10 en una máquina de 64 bits y uso Visual Studio 2015.

El objetivo Release / Win32 también funciona. Supongo que lo principal es elegir "Liberar".

Bob Stine
fuente