modul tidak aman untuk SAFESEH image C ++

87

Saya menggunakan Microsoft Visual Studio 2011 Professional Beta

Saya mencoba menjalankan file OpenCV C ++ ( http://opencv.willowgarage.com/wiki/Welcome ) yang telah saya kompilasi menggunakan cMake & Visual Studio Complier.

Namun ketika saya pergi untuk men-debug proyek, saya mendapatkan 600+ kesalahan yang sebagian besar adalah:

error LNK2026: modul tidak aman untuk image SAFESEH.

Tampaknya file-file ini ada dalam proyek opencv_ffmpeg tetapi saya tidak dapat menemukannya, saya telah melihat halaman Safe Exception Handlers safeseh di halaman bantuan Microsoft tetapi saya tidak dapat menemukan jawaban yang pasti.

Saya bertanya-tanya apakah ada orang lain yang mengalami masalah ini dan apakah mereka berhasil memperbaikinya.

Aaron Thompson
sumber
12
Ini terjadi saat Anda menautkan .obj atau .lib yang berisi kode yang dibuat oleh compiler versi sebelumnya. Yang tentu saja akan umum jika Anda mengunduh biner untuk opencv_ffmpeg alih-alih sumbernya. Anda dapat mematikan opsi penaut tetapi kemudian Anda masih memiliki ketidakcocokan versi CRT yang dapat byte. Bangun kembali pustaka dari sumber.
Hans Passant
Terima kasih atas bantuannya, berhasil
Aaron Thompson
@HansPassant Apa yang harus dilakukan jika tidak ada sumber?
GregC
4
Hal yang jelas: minta pemilik kode untuk memberi Anda pembaruan.
Hans Passant
@HansPassant Saya berharap pemasok masih ada untuk melakukan pembaruan. Kedengarannya seperti masalah "faktor truk satu".
GregC

Jawaban:

63

Dari komentar:

Ini terjadi saat Anda menautkan .obj atau .lib yang berisi kode yang dibuat oleh compiler versi sebelumnya. Yang tentu saja akan umum jika Anda mengunduh biner untuk opencv_ffmpeg alih-alih sumbernya. Anda dapat menonaktifkan opsi penaut tetapi Anda masih memiliki ketidakcocokan versi CRT yang dapat byte. Bangun kembali pustaka dari sumber. - Hans Passant 15 Mei pukul 13:01  
 
Terima kasih atas bantuannya, berhasil - Aaron Thompson 17 Mei pukul 14:50

Bo Persson
sumber
Hal ini juga dapat disebabkan oleh, seperti status kesalahan, modul yang penangan pengecualiannya tidak dapat ditemukan oleh linker. Modul bahasa assembly khususnya - seperti yang dibahas dalam jawaban lain. Ada beberapa info tentang ini di sini .
Nick Westgate
149

Menonaktifkan opsi "Gambar memiliki Penangan Pengecualian Aman" di properti Proyek -> Properti Konfigurasi -> Linker -> tab Lanjutan membantu saya.

Zhenya
sumber
3
Ini tidak berpengaruh bagi saya.
Pop-A-Stash
Begitu juga untuk saya. Tangkapannya tampaknya, meskipun saya dapat memilih SAFESEH: NO di submenu Opsi Lanjutan di bawah pengaturan linker, itu tidak akan tetap dipilih. Itu selalu kembali ke SAFESEH: YES.
pengguna382459
Sukses, dengan VS 2013 Express
gbarry
1
Sukses, VS 2015
2
Sukses, VS 2017
ke4ktz
12

Jika Anda mendapatkan kesalahan ini saat membangun ZLIB di Visual Studio di sini adalah solusinya. Cari contrib\masmx86\bld_ml32.batdan tambahkan /safesehsebagai opsi

Sebelum

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

Setelah

ml /safeseh /coff /Zi /c /Flmatch686.lst match686.asm
ml /safeseh /coff /Zi /c /Flinffas32.lst inffas32.asm
Nayana Adassuriya
sumber
Saya memiliki masalah yang sama dengan zlib, tetapi harus mengganti alat peraga pada .asmfile di penjelajah solusi.
Cillié Malan
11

Cara lain adalah dengan menambahkan beberapa handler SEH (kosong misalnya) ke file asm dan mengkompilasinya dengan /safesehopsi, kemudian mengkompilasi kode lain secara normal dengan /SAFESEH:YESopsi compiler.

Penangan SEH kosong:

.safeseh SEH_handler

SEH_handler   proc
;handler
ret

SEH_handler   endp
DitherSky
sumber
1
Saya tidak repot-repot menambahkan penangan ke sumber pihak ke-3 (zlib), /safesehsepertinya cukup. Ini benar-benar harus diberi suara positif!
mls
2
Siapapun yang memiliki masalah yang sama dengan zlib lihat ini (CTRL + F safeseh) tannerhelland.com/5076/compile-zlib-winapi-wapi-stdcall
codekiddy
Saya telah menambahkan "/ safeseh" ke baris perintah di properti untuk file .asm dan ini berhasil.
Norbert Boros
0

Jarak tempuh Anda mungkin berbeda, tetapi tidak satu pun dari saran di atas yang berhasil untuk saya (meskipun saya tidak mencoba menjalankan penangan pengecualian asm saya sendiri).

Apa yang berhasil adalah memilih build target Release / x64.

Saya menjalankan Windows 10 pada mesin 64-bit, dan menggunakan Visual Studio 2015.

Rilis target / Win32 juga berfungsi. Saya kira yang utama adalah memilih "Rilis".

Bob Stine
sumber