module non sécurisé pour l'image SAFESEH C ++


87

J'utilise Microsoft Visual Studio 2011 Professional Beta

J'essaie d'exécuter les fichiers OpenCV C ++ ( http://opencv.willowgarage.com/wiki/Welcome ) que j'ai compilés à l'aide de cMake et du Visual Studio Complier.

Cependant, lorsque je vais déboguer le projet, j'obtiens plus de 600 erreurs, la plupart d'entre elles étant:

erreur LNK2026: module non sécurisé pour l'image SAFESEH.

Apparemment, ces fichiers sont dans le projet opencv_ffmpeg mais je ne les ai pas trouvés, j'ai jeté un œil à la page Safe Exception Handlers de safeseh sur la page d'aide de Microsoft mais je n'ai pas trouvé de réponses définitives.

Je me demandais si quelqu'un d'autre avait eu ce problème et s'il avait réussi à le résoudre.


12
Cela se produit lorsque vous liez un .obj ou .lib qui contient du code créé par une version antérieure du compilateur. Ce qui, bien sûr, serait courant si vous téléchargiez un binaire pour opencv_ffmpeg au lieu de la source. Vous pouvez désactiver l'option de l'éditeur de liens, mais vous aurez toujours une incompatibilité de version CRT qui peut octet. Reconstruisez la bibliothèque à partir de la source.
Hans Passant

Merci pour l'aide, cela a fonctionné
Aaron Thompson

@HansPassant Que faire quand il n'y a pas de source?
GregC

4
La chose évidente: demandez au propriétaire du code de vous fournir une mise à jour.
Hans Passant

@HansPassant J'espère que le fournisseur est toujours là pour faire une mise à jour. Sonne comme un "facteur de camion d'un" type de problème.
GregC

Réponses:


63

D'après les commentaires:

Cela se produit lorsque vous liez un .obj ou .lib qui contient du code créé par une version antérieure du compilateur. Ce qui, bien sûr, serait courant si vous téléchargiez un binaire pour opencv_ffmpeg au lieu de la source. Vous pouvez désactiver l'option de l'éditeur de liens, mais vous aurez toujours une incompatibilité de version CRT qui peut octet. Reconstruisez la bibliothèque à partir de la source. - Hans Passant 15 mai à 13h01  
 
Merci pour l'aide, cela a fonctionné - Aaron Thompson 17 mai à 14h50


Cela peut également être causé par, comme l'indique l'erreur, des modules pour lesquels l'éditeur de liens ne peut pas trouver de gestionnaires d'exceptions sûrs. Modules de langage d'assemblage en particulier - comme indiqué dans d'autres réponses. Il y a quelques informations à ce sujet ici .
Nick Westgate

148

La désactivation de l'option «L'image a des gestionnaires d'exception sécurisés» dans les propriétés du projet -> Propriétés de configuration -> Éditeur de liens -> onglet Avancé m'a aidé.


3
Cela n'a eu aucun effet pour moi.
Pop-A-Stash

De même pour moi. Le hic semble être que, bien que je puisse choisir SAFESEH: NON dans le sous-menu Options avancées sous les paramètres de l'éditeur de liens, il ne restera pas choisi. Il revient toujours à SAFESEH: OUI.
user382459

Succès, avec VS 2013 Express
gbarry

1
Success, VS 2015

2
Success, VS 2017
ke4ktz

12

Si vous rencontrez cette erreur lors de la création de ZLIB dans Visual Studio, voici la solution. Rechercher contrib\masmx86\bld_ml32.batet ajouter /safesehen option

Avant

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

Après

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

J'ai eu le même problème avec zlib, mais j'ai dû changer les accessoires sur les .asmfichiers dans l'explorateur de solutions à la place.
Cillié Malan

11

Une autre façon est d'ajouter un gestionnaire SEH (vide par exemple) aux fichiers asm et de les compiler avec l' /safesehoption, puis de compiler normalement un autre code avec l' /SAFESEH:YESoption du compilateur.

Gestionnaire SEH vide:

.safeseh SEH_handler

SEH_handler   proc
;handler
ret

SEH_handler   endp

1
Je n'ai pas pris la peine d'ajouter un gestionnaire à la source tierce (zlib), cela /safesehsemble suffisant. Cela devrait vraiment être voté!
mlt

2
Toute personne ayant les mêmes problèmes avec zlib voir ceci (CTRL + F safeseh) tannerhelland.com/5076/compile-zlib-winapi-wapi-stdcall
codekiddy

J'ai ajouté "/ safeseh" à la ligne de commande dans les propriétés du fichier .asm et cela a fonctionné.
Norbert Boros

0

Votre kilométrage peut varier, mais aucune des suggestions ci-dessus n'a fonctionné pour moi (même si je n'ai pas essayé de lancer mon propre gestionnaire d'exceptions asm).

Ce qui a fonctionné a été de sélectionner la version cible de construction / x64.

J'exécute Windows 10 sur un ordinateur 64 bits et j'utilise Visual Studio 2015.

La version cible / Win32 fonctionne également. Je suppose que l'essentiel est de choisir "Release".

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.