SAFESEH 이미지 C ++에 대해 안전하지 않은 모듈


87

Microsoft Visual Studio 2011 Professional Beta를 사용하고 있습니다.

cMake 및 Visual Studio Complier를 사용하여 컴파일 한 OpenCV C ++ 파일 ( http://opencv.willowgarage.com/wiki/Welcome ) 을 실행하려고합니다 .

그러나 프로젝트를 디버깅 할 때 600 개 이상의 오류가 발생합니다.

오류 LNK2026 : SAFESEH 이미지에 대해 모듈이 안전하지 않습니다.

분명히이 파일은 opencv_ffmpeg 프로젝트에 있지만 찾을 수 없었고 Microsoft 도움말 페이지의 safeseh Safe Exception Handlers 페이지를 살펴 봤지만 확실한 답을 찾을 수 없었습니다.

나는 다른 누군가 가이 문제를 가지고 있는지 그리고 그들이 그것을 고칠 수 있는지 궁금합니다.


12
이는 이전 버전의 컴파일러에서 만든 코드가 포함 된 .obj 또는 .lib를 링크 할 때 발생합니다. 물론 소스 대신 opencv_ffmpeg 용 바이너리를 다운로드 한 경우 일반적입니다. 링커 옵션을 끌 수 있지만 그래도 바이트 수있는 CRT 버전 비 호환성이 유지됩니다. 소스에서 라이브러리를 다시 빌드하십시오.
Hans Passant

도움을 주셔서 감사합니다, 그것은 일
아론 톰슨에게

@HansPassant 소스가 없으면 어떻게해야합니까?
GregC

4
확실한 것은 코드 소유자에게 업데이트를 요청하는 것입니다.
Hans Passant 2015 년

@HansPassant 공급 업체가 여전히 업데이트를하기를 바랍니다. "일대일 트럭 요인"종류의 문제처럼 들립니다.
GregC

답변:


63

댓글에서 :

이는 이전 버전의 컴파일러에서 만든 코드가 포함 된 .obj 또는 .lib를 링크 할 때 발생합니다. 물론 소스 대신 opencv_ffmpeg 용 바이너리를 다운로드 한 경우 일반적입니다. 링커 옵션을 끌 수 있지만 그래도 바이트 수있는 CRT 버전 비 호환성이 유지됩니다. 소스에서 라이브러리를 다시 빌드하십시오. – Hans Passant 5 월 15 일 13:01  
 
도움에 감사드립니다 – Aaron Thompson 5 월 17 일 14:50


링커가 안전한 예외 처리기를 찾을 수없는 모듈로 인해 오류 상태로 나타날 수도 있습니다. 특히 어셈블리 언어 모듈-다른 답변에서 논의되었습니다. 여기에 이에 대한 정보가 있습니다 .
Nick Westgate

149

프로젝트 속성-> 구성 속성-> 링커-> 고급 탭에서 "이미지에 안전한 예외 처리기가 있습니다"옵션을 비활성화하면 도움이되었습니다.


3
이것은 나에게 영향을 미치지 않았습니다.
Pop-A-Stash

저도 마찬가지입니다. 링커 설정의 고급 옵션 하위 메뉴에서 SAFESEH : NO를 선택할 수 있지만 선택한 상태로 유지되지는 않는 것 같습니다. 항상 SAFESEH : YES로 되돌아갑니다.
user382459

VS 2013 Express로 성공
gbarry

1
성공, VS 2015

2
성공, VS 2017
ke4ktz

12

Visual Studio에서 ZLIB를 빌드하는 동안이 오류가 발생하면 여기에 해결책이 있습니다. 를 찾아 contrib\masmx86\bld_ml32.bat및 추가 /safeseha 옵션으로

전에

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대신 솔루션 탐색기에서 파일의 소품을 변경해야했습니다 .
Cillié Malan

11

다른 방법은 일부 SEH 핸들러 (예 : 비어 있음)를 asm 파일에 추가하고 /safeseh옵션으로 컴파일 한 다음 /SAFESEH:YES컴파일러 옵션 으로 다른 코드를 정상적으로 컴파일하는 것입니다 .

빈 SEH 핸들러 :

.safeseh SEH_handler

SEH_handler   proc
;handler
ret

SEH_handler   endp

1
제 3 자 소스 (zlib)에 핸들러를 추가하는 것을 귀찮게하지 않았습니다 /safeseh. 이것은 정말로 찬성되어야합니다!
mlt

2
zlib에 동일한 문제가있는 사람은 다음을 참조하십시오 (CTRL + F safeseh). tannerhelland.com/5076/compile-zlib-winapi-wapi-stdcall
codekiddy

.asm 파일의 속성에서 명령 줄에 "/ safeseh"를 추가했는데이 기능이 작동했습니다.
Norbert Boros

0

마일리지는 다를 수 있지만 위의 제안 중 어느 것도 저에게 효과가 없었습니다 (내 자신의 asm 예외 처리기를 롤링하지 않았지만).

작업 한 것은 빌드 대상 릴리스 / x64를 선택하는 것입니다.

64 비트 컴퓨터에서 Windows 10을 실행하고 Visual Studio 2015를 사용하고 있습니다.

타겟 Release / Win32도 작동합니다. 가장 중요한 것은 "Release"를 선택하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.