Pytanie moduł niebezpieczny dla obrazu SAFESEH C ++


Korzystam z Microsoft Visual Studio 2011 Professional Beta

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

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

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

Najwyraźniej pliki te są w projekcie opencv_ffmpeg, ale nie mogłem ich znaleźć. Zajrzałem do strony Safeseh Safe Exception Handlers na stronie pomocy Microsoftu, ale nie mogłem znaleźć żadnych ostatecznych odpowiedzi.

Zastanawiam się, czy ktoś inny miał ten problem i czy udało się to naprawić.


76
2018-05-15 11:41


pochodzenie


Dzieje się tak po połączeniu pliku .obj lub .lib zawierającego kod utworzony przez starszą wersję kompilatora. Co oczywiście byłoby powszechne, gdybyś pobrał plik binarny dla opencv_ffmpeg zamiast źródła. Możesz wyłączyć opcję linkera, ale nadal będziesz miał niekompatybilność wersji CRT, która może bajt. Przebuduj bibliotekę ze źródła. - Hans Passant
Dzięki za pomoc, zadziałało - Aaron Thompson
@HansPassant Co robić, gdy nie ma źródła? - GregC
Oczywiste: poproś właściciela kodu, aby dostarczył aktualizację. - Hans Passant
@HansPassant Mam nadzieję, że dostawca nadal będzie w stanie dokonać aktualizacji. Brzmi jak problem typu "samochód ciężarowy jednego". - GregC


Odpowiedzi:


Z komentarzy:

Dzieje się tak po połączeniu pliku .obj lub .lib zawierającego kod utworzony przez starszą wersję kompilatora. Co oczywiście byłoby powszechne, gdybyś pobrał plik binarny dla opencv_ffmpeg zamiast źródła. Możesz wyłączyć opcję linkera, ale nadal będziesz miał niekompatybilność wersji CRT, która może bajt. Przebuduj 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


54
2017-11-03 16:36



Może to być również spowodowane, jak podaje błąd, modułami, dla których linker nie może znaleźć bezpiecznych procedur obsługi wyjątków. W szczególności moduły językowe - tak jak omówiono w innych odpowiedziach. Jest trochę informacji na ten temat tutaj. - Nick Westgate


Wyłączenie opcji "Image has Safe Exception Handlers" we właściwościach projektu -> Właściwości konfiguracji -> Łącznik -> zakładka Zaawansowane pomogły mi.


118
2017-09-10 16:48



To nie miało dla mnie żadnego skutku. - Pop-A-Stash
Podobnie dla mnie. Połów wydaje się, że chociaż mogę wybrać SAFESEH: NO w podmenu Opcje zaawansowane pod ustawieniami linkera, nie zostanie on wybrany. Zawsze powraca do SAFESEH: TAK. - user382459
Sukces dzięki VS 2013 Express - gbarry
Sukces, VS 2015 - Yuri S. Cherkasov
Sukces, VS 2012 - themadmax


Innym sposobem jest dodanie niektórych handlerów SEH (np. Pustych) do plików ASM i skompilowanie ich /safeseh opcję, a następnie skompiluj inny kod normalnie za pomocą /SAFESEH:YES opcja kompilatora.

Pusty przewodnik SEH:

.safeseh SEH_handler

SEH_handler   proc
;handler
ret

SEH_handler   endp

6
2017-11-27 10:03



Nie zawracałem sobie głowy dodawaniem handlerka do źródła 3rd party (zlib), /safeseh wydaje się wystarczające. To naprawdę powinno zostać przegłosowane! - mlt
Każdy, kto ma takie same problemy z zlib, zobacz to (CTRL + F safeseh) tannerhelland.com/5076/compile-zlib-winapi-wapi-stdcall - codekiddy


Jeśli masz ten błąd podczas budowania ZLIB w Visual Studio, tutaj jest rozwiązanie. Szukać contrib\masmx86\bld_ml32.bat i dodaj /safeseh jako opcja

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

6
2018-05-15 18:38



Miałem ten sam problem z zlib, ale musiałem zmienić rekwizyty na .asm pliki w eksploratorze rozwiązań. - Cillié Malan


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

To, co pracowało, to wybrać wersję docelową Release / x64.

Korzystam z systemu Windows 10 na maszynie 64-bitowej i przy użyciu programu Visual Studio 2015.

Docelowy Release / Win32 działa również. Chyba najważniejsze jest wybranie "Release".


0