SAFESEHイメージC ++に対してモジュールは安全ではありません


87

Microsoft Visual Studio 2011 ProfessionalBetaを使用しています

cMakeとVisualStudioComplierを使用してコンパイルしたOpenCVC ++ファイル(http://opencv.willowgarage.com/wiki/Welcome)を実行しようとしています。

ただし、プロジェクトをデバッグしようとすると、600以上のエラーが発生します。そのほとんどは次のとおりです。

エラーLNK2026:モジュールはSAFESEHイメージに対して安全ではありません。

どうやらこれらのファイルはopencv_ffmpegプロジェクトにありますが、見つかりませんでした。Microsoftヘルプページのsafeseh Safe Exception Handlersページを確認しましたが、明確な回答は見つかりませんでした。

他の誰かがこの問題を抱えていて、彼らがなんとかそれを修正したかどうか疑問に思いました。


12
これは、以前のバージョンのコンパイラによって作成されたコードを含む.objまたは.libをリンクするときに発生します。もちろん、ソースの代わりにopencv_ffmpegのバイナリをダウンロードした場合はどちらが一般的でしょう。リンカオプションをオフにすることはできますが、それでもバイトできるCRTバージョンの非互換性があります。ソースからライブラリを再構築します。
ハンスパッサント2012年

助けてくれてありがとう、それはうまくいった
Aaron Thompson

@HansPassantソースがない場合はどうすればよいですか?
gregC 2012

4
明らかなこと:コードの所有者に更新を提供するように依頼してください。
ハンスパッサント2012

@HansPassantサプライヤーがまだ更新を行っていることを願っています。「1つのトラック要因」のような問題のように聞こえます。
gregC 2012

回答:


63

コメントから:

これは、以前のバージョンのコンパイラによって作成されたコードを含む.objまたは.libをリンクするときに発生します。もちろん、ソースの代わりにopencv_ffmpegのバイナリをダウンロードした場合はどちらが一般的でしょう。リンカオプションをオフにすることはできますが、それでもバイトできるCRTバージョンの非互換性があります。ソースからライブラリを再構築します。–ハンスパッサント5月15日13:01  
 
助けてくれてありがとう、それはうまくいった–アーロントンプソン5月17日14:50


また、エラー状態として、リンカが安全な例外ハンドラを見つけることができないモジュールが原因である可能性もあります。特にアセンブリ言語モジュール-他の回答で説明されているように。これに関するいくつかの情報がここにあります
Nick Westgate 2017

148

[プロジェクトのプロパティ]-> [構成のプロパティ]-> [リンカー]-> [詳細設定]タブで[画像に安全な例外ハンドラーがあります]オプションを無効にすると、役に立ちました。


3
これは私には何の効果もありませんでした。
Pop-A-Stash 2015年

私も同様です。キャッチは、リンカー設定の[詳細オプション]サブメニューでSAFESEH:NOを選択できますが、選択されたままにならないことです。常にSAFESEH:YESに戻ります。
user382459 2016

成功、VS 2013 Express
gbarry 2017

1
成功、VS 2015

2
成功、VS 2017
ke4ktz

12

Visual StudioでZLIBをビルドしているときにこのエラーが発生した場合は、ここに解決策があります。オプションとして探してcontrib\masmx86\bld_ml32.bat追加する/safeseh

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

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

zlibでも同じ問題が発生しました.asmが、代わりにソリューションエクスプローラーでファイルの小道具を変更する必要がありました。
シリエマラン2018

11

他の方法は、いくつかのSEHハンドラー(たとえば空)をasmファイルに追加し、/safesehオプションを使用してそれらをコンパイルしてから、/SAFESEH:YESコンパイラーオプションを使用して他のコードを通常どおりにコンパイルすることです。

空のSEHハンドラー:

.safeseh SEH_handler

SEH_handler   proc
;handler
ret

SEH_handler   endp

1
サードパーティのソース(zlib)にハンドラーを追加する必要はありません/safesehでした。これは本当に賛成する必要があります!
mlt 2015年

2
zlibで同じ問題を抱えている人は、これを参照してください(CTRL + F safeseh)tannerhelland.com/5076/compile-zlib-winapi-wapi-stdcall
codekiddy

.asmファイルのプロパティのコマンドラインに「/ safeseh」を追加しましたが、これは機能しました。
Norbert Boros

0

あなたのマイレージは変わるかもしれませんが、上記の提案はどれも私にはうまくいきませんでした(私は自分のasm例外ハンドラーをロールしようとしませんでしたが)。

動作したのは、ビルドターゲットRelease / x64を選択することでした。

64ビットマシンでWindows10を実行していて、Visual Studio2015を使用しています。

ターゲットのRelease / Win32も機能します。主なものは「リリース」を選ぶことだと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.