modulo non sicuro per l'immagine SAFESEH C ++


87

Sto utilizzando Microsoft Visual Studio 2011 Professional Beta

Sto cercando di eseguire i file OpenCV C ++ ( http://opencv.willowgarage.com/wiki/Welcome ) che ho compilato utilizzando cMake e Visual Studio Complier.

Tuttavia, quando eseguo il debug del progetto ottengo più di 600 errori, la maggior parte dei quali:

errore LNK2026: modulo non sicuro per l'immagine SAFESEH.

Apparentemente questi file si trovano nel progetto opencv_ffmpeg ma non sono riuscito a trovarli, ho dato un'occhiata alla pagina dei gestori delle eccezioni sicure sulla pagina della guida di Microsoft ma non sono riuscito a trovare alcuna risposta definitiva.

Mi chiedevo se qualcun altro ha avuto questo problema e se sono riusciti a risolverlo.


12
Ciò accade quando si collega un .obj o .lib che contiene codice creato da una versione precedente del compilatore. Il che ovviamente sarebbe comune se scarichi un binario per opencv_ffmpeg invece del sorgente. Puoi disattivare l'opzione del linker, ma avrai comunque un'incompatibilità della versione CRT che può byte. Ricostruisci la libreria dall'origine.
Hans Passant

Grazie per l'aiuto, ha funzionato
Aaron Thompson

@HansPassant Cosa fare quando non c'è una fonte?
GregC

4
La cosa ovvia: chiedi al proprietario del codice di fornirti un aggiornamento.
Hans Passant,

@HansPassant Spero che il fornitore sia ancora in giro per fare un aggiornamento. Suona come un tipo di problema "fattore camion di uno".
GregC

Risposte:


63

Dai commenti:

Ciò accade quando si collega un .obj o .lib che contiene codice creato da una versione precedente del compilatore. Il che ovviamente sarebbe comune se scarichi un binario per opencv_ffmpeg invece del sorgente. Puoi disattivare l'opzione del linker, ma avrai comunque un'incompatibilità della versione CRT che può byte. Ricostruisci la libreria dall'origine. - Hans Passant 15 maggio alle 13:01  
 
Grazie per l'aiuto, ha funzionato - Aaron Thompson 17 maggio alle 14:50


Può anche essere causato, come afferma l'errore, da moduli per cui il linker non riesce a trovare gestori di eccezioni sicuri. Moduli in linguaggio Assembly in particolare, come discusso in altre risposte. Ci sono alcune informazioni su questo qui .
Nick Westgate

148

La disattivazione dell'opzione "L'immagine ha gestori di eccezioni sicure" in Proprietà del progetto -> Proprietà di configurazione -> Linker -> scheda Avanzate mi ha aiutato.


3
Questo non ha avuto effetto per me.
Pop-A-Stash

Allo stesso modo per me. Il problema sembra essere che, sebbene io possa scegliere SAFESEH: NO nel sottomenu Opzioni avanzate sotto le impostazioni del linker, non rimarrà scelto. Torna sempre a SAFESEH: YES.
user382459

Successo, con VS 2013 Express
gbarry

1
Successo, VS 2015

2
Successo, VS 2017
ke4ktz

12

Se hai ricevuto questo errore durante la creazione di ZLIB in Visual Studio, ecco la soluzione. Cerca contrib\masmx86\bld_ml32.bate aggiungi /safesehcome opzione

Prima

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

Dopo

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

Ho avuto lo stesso problema con zlib, ma ho dovuto invece cambiare gli oggetti di scena sui .asmfile in Esplora soluzioni.
Cillié Malan

11

Un altro modo è aggiungere un po 'di gestore SEH (vuoto per esempio) ai file asm e compilarli con l' /safesehopzione, quindi compilare normalmente altro codice con l' /SAFESEH:YESopzione del compilatore.

Gestore SEH vuoto:

.safeseh SEH_handler

SEH_handler   proc
;handler
ret

SEH_handler   endp

1
Non mi sono preoccupato di aggiungere un gestore alla fonte di terze parti (zlib), /safesehsembra sufficiente. Questo dovrebbe davvero essere votato!
mlt

2
Chiunque abbia gli stessi problemi con zlib vede questo (CTRL + F safeseh) tannerhelland.com/5076/compile-zlib-winapi-wapi-stdcall
codekiddy

Ho aggiunto "/ safeseh" alla riga di comando nelle proprietà del file .asm e ha funzionato.
Norbert Boros il

0

Il tuo chilometraggio può variare, ma nessuno dei suggerimenti sopra ha funzionato per me (anche se non ho provato a creare il mio gestore di eccezioni asm).

Quello che ha funzionato è stato selezionare il target di build Release / x64.

Utilizzo Windows 10 su una macchina a 64 bit e utilizzo Visual Studio 2015.

Anche la Release / Win32 di destinazione funziona. Immagino che la cosa principale sia scegliere "Release".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.