moduł niebezpieczny dla obrazu SAFESEH C ++

87

Używam programu Microsoft Visual Studio 2011 Professional Beta

Próbuję uruchomić pliki OpenCV C ++ ( http://opencv.willowgarage.com/wiki/Welcome ), które skompilowałem przy użyciu cMake i Visual Studio Complier.

Jednak kiedy idę do debugowania projektu, otrzymuję ponad 600 błędów, z których większość to:

błąd LNK2026: moduł niebezpieczny dla obrazu SAFESEH.

Najwyraźniej te pliki znajdują się w projekcie opencv_ffmpeg, ale nie mogłem ich znaleźć. Zajrzałem na stronę Safe Exception Handlers na stronie pomocy Microsoft, ale nie mogłem znaleźć żadnych ostatecznych odpowiedzi.

Zastanawiałem się, czy ktoś inny miał ten problem i czy udało mu się go naprawić.

Aaron Thompson
źródło
12
Dzieje się tak, gdy łączysz plik .obj lub .lib, który zawiera kod utworzony przez wcześniejszą wersję kompilatora. Co oczywiście byłoby powszechne, gdybyś pobrał plik binarny dla opencv_ffmpeg zamiast źródła. Możesz wyłączyć opcję konsolidatora, ale nadal będziesz mieć niezgodność wersji CRT, która może bajtować. Odbuduj bibliotekę ze źródła.
Hans Passant
Dzięki za pomoc, udało się
Aaron Thompson
@HansPassant Co zrobić, gdy nie ma źródła?
GregC
4
Rzecz oczywista: poproś właściciela kodu o aktualizację.
Hans Passant
@HansPassant Mam nadzieję, że dostawca nadal jest w pobliżu, aby dokonać aktualizacji. Brzmi jak „czynnik ciężarówki jednego” problemu.
GregC

Odpowiedzi:

63

Z komentarzy:

Dzieje się tak, gdy łączysz plik .obj lub .lib, który zawiera kod utworzony przez wcześniejszą wersję kompilatora. Co oczywiście byłoby powszechne, gdybyś pobrał plik binarny dla opencv_ffmpeg zamiast źródła. Możesz wyłączyć opcję konsolidatora, ale nadal będziesz mieć niezgodność wersji CRT, która może bajtować. Odbuduj bibliotekę ze źródła. - Hans Passant 15 maja o 13:01  
 
Dzięki za pomoc, zadziałało - Aaron Thompson 17 maja o 14:50

Bo Persson
źródło
Może to być również spowodowane, jak stwierdza błąd, moduły, dla których konsolidator nie może znaleźć bezpiecznych programów obsługi wyjątków. W szczególności moduły języka asemblera - omówione w innych odpowiedziach. Istnieje kilka informacji na ten temat tutaj .
Nick Westgate,
148

Pomogło mi wyłączenie opcji „Obraz ma bezpieczną obsługę wyjątków” we właściwościach projektu -> Właściwości konfiguracyjne -> Konsolidator -> karta Zaawansowane.

Zhenya
źródło
3
Nie miało to na mnie żadnego efektu.
Pop-A-Stash
Podobnie dla mnie. Problem polega na tym, że chociaż mogę wybrać SAFESEH: NO w podmenu Advanced Options w ustawieniach linkera, nie pozostanie on wybrany. Zawsze wraca do SAFESEH: TAK.
user382459
Sukces z VS 2013 Express
gbarry,
1
Sukces, VS 2015
2
Sukces, VS 2017
ke4ktz
12

Jeśli masz ten błąd podczas tworzenia ZLIB w programie Visual Studio, oto rozwiązanie. Poszukaj contrib\masmx86\bld_ml32.bati dodaj /safesehjako opcję

Przed

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

Po

ml /safeseh /coff /Zi /c /Flmatch686.lst match686.asm
ml /safeseh /coff /Zi /c /Flinffas32.lst inffas32.asm
Nayana Adassuriya
źródło
Miałem ten sam problem z zlib, ale .asmzamiast tego musiałem zmienić właściwości plików w eksploratorze rozwiązań.
Cillié Malan
11

Innym sposobem jest dodanie jakiegoś handlera SEH (na przykład pustego) do plików asm i skompilowanie ich z /safesehopcją, a następnie skompilowanie innego kodu normalnie z/SAFESEH:YES opcją kompilatora.

Pusta obsługa SEH:

.safeseh SEH_handler

SEH_handler   proc
;handler
ret

SEH_handler   endp
DitherSky
źródło
1
Nie zawracałem sobie głowy dodawaniem programu obsługi do zewnętrznego źródła (zlib), /safesehwydaje się , że wystarczy. To naprawdę powinno być pochwalone!
mlt
2
Każdy, kto ma te same problemy z zlib, zobacz to (CTRL + F safeseh) tannerhelland.com/5076/compile-zlib-winapi-wapi-stdcall
codekiddy
Dodałem „/ safeseh” do wiersza poleceń we właściwościach pliku .asm i to zadziałało.
Norbert Boros
0

Twój przebieg może się różnić, ale żadna z powyższych sugestii nie zadziałała (chociaż nie próbowałem używać własnego programu obsługi wyjątków ASM).

Co zadziałało, to wybranie celu kompilacji Release / x64.

Używam systemu Windows 10 na komputerze 64-bitowym i używam programu Visual Studio 2015.

Docelowa wersja Release / Win32 też działa. Myślę, że najważniejsze jest wybranie „Release”.

Bob Stine
źródło