Modul unsicher für SAFESEH-Image C ++

86

Ich verwende Microsoft Visual Studio 2011 Professional Beta

Ich versuche, die OpenCV C ++ - Dateien ( http://opencv.willowgarage.com/wiki/Welcome ) auszuführen, die ich mit cMake und dem Visual Studio Complier kompiliert habe.

Wenn ich jedoch das Projekt debugge, erhalte ich mehr als 600 Fehler. Die meisten davon sind:

Fehler LNK2026: Modul für SAFESEH-Image unsicher.

Anscheinend befinden sich diese Dateien im opencv_ffmpeg-Projekt, aber ich konnte sie nicht finden. Ich habe mir die Seite safeseh Safe Exception Handlers auf der Microsoft-Hilfeseite angesehen, aber keine endgültigen Antworten gefunden.

Ich habe mich gefragt, ob jemand anderes dieses Problem hatte und ob er es geschafft hat, es zu beheben.

Aaron Thompson
quelle
12
Dies geschieht, wenn Sie eine .obj- oder .lib-Datei verknüpfen, die Code enthält, der von einer früheren Version des Compilers erstellt wurde. Was natürlich üblich wäre, wenn Sie anstelle der Quelle eine Binärdatei für opencv_ffmpeg herunterladen würden. Sie können die Linker-Option deaktivieren, haben dann aber immer noch eine Inkompatibilität der CRT-Version, die Byte kann. Erstellen Sie die Bibliothek aus dem Quellcode neu.
Hans Passant
Vielen Dank für die Hilfe, es hat funktioniert
Aaron Thompson
@HansPassant Was tun, wenn keine Quelle vorhanden ist?
GregC
4
Das Offensichtliche: Bitten Sie den Besitzer des Codes, Ihnen ein Update zur Verfügung zu stellen.
Hans Passant
@HansPassant Ich hoffe, der Lieferant ist noch da, um ein Update vorzunehmen. Klingt nach einem "Truck Factor of One" -Problem.
GregC

Antworten:

63

Aus den Kommentaren:

Dies geschieht, wenn Sie eine .obj- oder .lib-Datei verknüpfen, die Code enthält, der von einer früheren Version des Compilers erstellt wurde. Was natürlich üblich wäre, wenn Sie anstelle der Quelle eine Binärdatei für opencv_ffmpeg herunterladen würden. Sie können die Linker-Option deaktivieren, haben dann aber immer noch eine Inkompatibilität der CRT-Version, die Byte kann. Erstellen Sie die Bibliothek aus dem Quellcode neu. - Hans Passant 15. Mai um 13:01  
 
Danke für die Hilfe, es hat funktioniert - Aaron Thompson 17. Mai um 14:50

Bo Persson
quelle
Es kann auch durch Module verursacht werden, für die der Linker keine sicheren Ausnahmebehandler finden kann. Insbesondere Assembler-Module - wie in anderen Antworten erläutert. Es gibt einige Informationen zu dieser hier .
Nick Westgate
146

Das Deaktivieren der Option "Image hat sichere Ausnahmebehandlungsroutinen" in den Projekteigenschaften -> Konfigurationseigenschaften -> Linker -> Registerkarte "Erweitert" hat mir geholfen.

Zhenya
quelle
3
Das hatte für mich keine Wirkung.
Pop-A-Stash
Ebenso für mich. Der Haken scheint zu sein, dass, obwohl ich SAFESEH: NO im Untermenü Erweiterte Optionen unter den Linker-Einstellungen auswählen kann, es nicht ausgewählt bleibt. Es kehrt immer wieder zu SAFESEH zurück: JA.
user382459
Erfolg, mit VS 2013 Express
gbarry
1
Erfolg, VS 2015
2
Erfolg, VS 2017
ke4ktz
12

Wenn Sie diesen Fehler beim Erstellen von ZLIB in Visual Studio erhalten haben, finden Sie hier die Lösung. Suchen contrib\masmx86\bld_ml32.batund /safesehals Option hinzufügen

Vor

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

Nach dem

ml /safeseh /coff /Zi /c /Flmatch686.lst match686.asm
ml /safeseh /coff /Zi /c /Flinffas32.lst inffas32.asm
Nayana Adassuriya
quelle
Ich hatte das gleiche Problem mit zlib, musste aber stattdessen die Requisiten für die .asmDateien im Lösungs-Explorer ändern .
Cillié Malan
11

Eine andere Möglichkeit besteht darin, asm-Dateien mit einem SEH-Handler (zum Beispiel leer) zu versehen und mit der /safesehOption zu kompilieren. Anschließend wird der andere Code normalerweise mit der /SAFESEH:YESCompiler-Option kompiliert.

Leerer SEH-Handler:

.safeseh SEH_handler

SEH_handler   proc
;handler
ret

SEH_handler   endp
DitherSky
quelle
1
Ich habe mich nicht darum gekümmert, der Quelle eines Drittanbieters (zlib) einen Handler hinzuzufügen, /safesehscheint genug zu sein. Das sollte wirklich positiv bewertet werden!
Mlt
2
Jeder, der die gleichen Probleme mit zlib hat, sieht dies (STRG + F safeseh) tannerhelland.com/5076/compile-zlib-winapi-wapi-stdcall
codekiddy
Ich habe der Befehlszeile in den Eigenschaften für die .asm-Datei "/ safeseh" hinzugefügt, und dies hat funktioniert.
Norbert Boros
0

Ihr Kilometerstand kann variieren, aber keiner der oben genannten Vorschläge hat für mich funktioniert (obwohl ich nicht versucht habe, meinen eigenen Asm-Ausnahmebehandler zu rollen).

Was funktionierte, war die Auswahl des Build-Ziels Release / x64.

Ich verwende Windows 10 auf einem 64-Bit-Computer und verwende Visual Studio 2015.

Das Ziel Release / Win32 funktioniert auch. Ich denke, die Hauptsache ist, "Release" zu wählen.

Bob Stine
quelle