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.