modül SAFESEH görüntüsü C ++ için güvenli değil


87

Microsoft Visual Studio 2011 Professional Beta kullanıyorum

CMake ve Visual Studio Complier kullanarak derlediğim OpenCV C ++ dosyalarını ( http://opencv.willowgarage.com/wiki/Welcome ) çalıştırmaya çalışıyorum .

Ancak projede hata ayıklamaya gittiğimde çoğu 600'den fazla hata alıyorum:

hata LNK2026: modül SAFESEH görüntüsü için güvenli değil.

Görünüşe göre bu dosyalar opencv_ffmpeg projesinde ama bulamadım, Microsoft yardım sayfasındaki güvenli Güvenli İstisna İşleyicileri sayfasına baktım ancak kesin bir yanıt bulamadım.

Başka birinin bu sorunu yaşayıp yaşamadığını ve düzeltmeyi başardıklarını merak ediyordum.


12
Bu, derleyicinin önceki bir sürümü tarafından oluşturulan kodu içeren bir .obj veya .lib bağladığınızda gerçekleşir. Kaynak yerine opencv_ffmpeg için bir ikili dosya indirirseniz hangisi yaygın olurdu. Bağlayıcı seçeneğini kapatabilirsiniz, ancak daha sonra bayt yapabilen bir CRT sürümü uyumsuzluğuna sahip olacaksınız. Kitaplığı kaynaktan yeniden oluşturun.
Hans Passant

Yardım için teşekkürler, işe yaradı
Aaron Thompson

@HansPassant Kaynak yokken ne yapmalı?
GregC

4
Bariz olan şey: kodun sahibinden size bir güncelleme sağlamasını isteyin.
Hans Passant

@HansPassant Umarım tedarikçi güncelleme yapmak için hala buradadır. "Kamyon faktörü bir" tür bir soruna benziyor.
GregC

Yanıtlar:


63

Yorumlardan:

Bu, derleyicinin önceki bir sürümü tarafından oluşturulan kodu içeren bir .obj veya .lib bağladığınızda gerçekleşir. Kaynak yerine opencv_ffmpeg için bir ikili dosya indirirseniz hangisi yaygın olurdu. Bağlayıcı seçeneğini kapatabilirsiniz, ancak daha sonra bayt yapabilen bir CRT sürümü uyumsuzluğuna sahip olacaksınız. Kitaplığı kaynaktan yeniden oluşturun. - Hans Passant 15 Mayıs 13:01  
 
Yardım için teşekkürler, işe yaradı - Aaron Thompson 17 Mayıs 14:50


Hata durumu olarak, bağlayıcının güvenli istisna işleyicileri bulamadığı modüllerden de kaynaklanabilir. Özellikle Assembly dili modülleri - diğer cevaplarda tartışıldığı gibi. Burada bununla ilgili bazı bilgiler var .
Nick Westgate

149

Proje özellikleri -> Konfigürasyon Özellikleri -> Bağlayıcı -> Gelişmiş sekmesindeki "Resimde Güvenli İstisna İşleyicileri Var" seçeneğini devre dışı bırakmak bana yardımcı oldu.


3
Bunun benim için hiçbir etkisi olmadı.
Pop-A-Stash

Aynen benim için. Yakalama, linker ayarlarının altındaki Gelişmiş Seçenekler alt menüsünde SAFESEH: HAYIR'ı seçebilsem de, seçili kalmayacak gibi görünüyor. Her zaman SAFESEH: EVET'e geri döner.
user382459

Başarı, VS 2013 Express ile
gbarry

1
Başarı, VS 2015

2
Başarı, VS 2017
ke4ktz

12

Visual Studio'da ZLIB oluştururken bu hatayı aldıysanız çözüm burada. Ara contrib\masmx86\bld_ml32.batve /safesehseçenek olarak ekle

Önce

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

Sonra

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

Zlib ile aynı sorunu yaşadım, ancak .asmbunun yerine çözüm gezginindeki dosyalardaki sahne öğelerini değiştirmem gerekti .
Cillié Malan

11

Diğer bir yol, asm dosyalarına bazı SEH işleyicileri (örneğin boş) eklemek ve bunları /safesehseçenekle derlemek, ardından normal olarak başka bir kodu derlemektir./SAFESEH:YES derleyici seçeneğiyle .

Boş SEH işleyicisi:

.safeseh SEH_handler

SEH_handler   proc
;handler
ret

SEH_handler   endp

1
3. parti kaynağa (zlib) bir işleyici eklemekle uğraşmadım, /safesehyeterli görünüyor. Bu gerçekten olumlu oylanmalı!
mlt

2
Zlib ile aynı problemleri olan herkes bu (CTRL + F safeseh) tannerhelland.com/5076/compile-zlib-winapi-wapi-stdcall
codekiddy

.Asm dosyasının özelliklerinde komut satırına "/ safeseh" ekledim ve bu işe yaradı.
Norbert Boros

0

Kilometreniz değişebilir, ancak yukarıdaki önerilerden hiçbiri benim için işe yaramadı (kendi asm istisna işleyicimi atmayı denememiş olsam da).

İşe yarayan şey, sürüm / x64 derleme hedefini seçmekti.

Windows 10'u 64 bitlik bir makinede çalıştırıyorum ve Visual Studio 2015 kullanıyorum.

Hedef Release / Win32 de çalışıyor. Sanırım asıl önemli olan "Serbest Bırak" ı seçmek.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.