โมดูลไม่ปลอดภัยสำหรับ SAFESEH อิมเมจ C ++


87

ฉันใช้ Microsoft Visual Studio 2011 Professional Beta

ฉันพยายามเรียกใช้ไฟล์ OpenCV C ++ ( http://opencv.willowgarage.com/wiki/Welcome ) ที่ฉันได้รวบรวมโดยใช้ cMake & the Visual Studio Complier

อย่างไรก็ตามเมื่อฉันไปที่ดีบักโครงการฉันได้รับข้อผิดพลาดมากกว่า 600 ข้อส่วนใหญ่เป็น:

ข้อผิดพลาด LNK2026: โมดูลไม่ปลอดภัยสำหรับอิมเมจ SAFESEH

เห็นได้ชัดว่าไฟล์เหล่านี้อยู่ในโครงการ opencv_ffmpeg แต่ฉันหาไม่พบฉันได้ดูที่หน้าตัวจัดการข้อยกเว้น Safeeseh ในหน้าวิธีใช้ของ Microsoft แต่ฉันไม่พบคำตอบที่ชัดเจน

ฉันสงสัยว่ามีใครบ้างที่มีปัญหานี้และถ้าพวกเขาสามารถแก้ไขได้


12
สิ่งนี้เกิดขึ้นเมื่อคุณเชื่อมโยง. obj หรือ. lib ที่มีโค้ดที่สร้างโดยคอมไพลเลอร์เวอร์ชันก่อนหน้า ซึ่งแน่นอนว่าจะเป็นเรื่องปกติหากคุณดาวน์โหลดไบนารีสำหรับ opencv_ffmpeg แทนซอร์ส คุณสามารถปิดตัวเลือกตัวเชื่อมโยง แต่คุณจะยังคงมีความเข้ากันไม่ได้ของเวอร์ชัน CRT ที่สามารถไบต์ สร้างไลบรารีใหม่จากซอร์ส
Hans Passant

ขอบคุณสำหรับความช่วยเหลือมันใช้งานได้
Aaron Thompson

@HansPassant จะทำอย่างไรเมื่อไม่มีที่มา?
GregC

4
สิ่งที่ชัดเจน: ขอให้เจ้าของรหัสแจ้งการอัปเดตให้คุณ
Hans Passant

@HansPassant ฉันหวังว่าซัพพลายเออร์จะยังคงทำการปรับปรุง ฟังดูเป็นปัญหาประเภท "รถบรรทุกหนึ่งเดียว"
GregC

คำตอบ:


63

จากความคิดเห็น:

สิ่งนี้เกิดขึ้นเมื่อคุณเชื่อมโยง. obj หรือ. lib ที่มีโค้ดที่สร้างโดยคอมไพลเลอร์เวอร์ชันก่อนหน้า ซึ่งแน่นอนว่าจะเป็นเรื่องปกติหากคุณดาวน์โหลดไบนารีสำหรับ opencv_ffmpeg แทนซอร์ส คุณสามารถปิดตัวเลือกตัวเชื่อมโยง แต่คุณจะยังคงมีความเข้ากันไม่ได้ของเวอร์ชัน CRT ที่สามารถไบต์ สร้างไลบรารีใหม่จากซอร์ส - Hans Passant 15 พฤษภาคมเวลา 13:01 น.  
 
ขอบคุณสำหรับความช่วยเหลือมันได้ผล - Aaron Thompson 17 พฤษภาคมเวลา 14:50 น


นอกจากนี้ยังอาจเกิดจากในขณะที่สถานะข้อผิดพลาดโมดูลที่ตัวเชื่อมโยงไม่พบตัวจัดการข้อยกเว้นที่ปลอดภัย โมดูลภาษาแอสเซมบลีโดยเฉพาะ - ตามที่กล่าวไว้ในคำตอบอื่น ๆ มีข้อมูลบางอย่างเกี่ยวกับเรื่องนี้ที่นี่
Nick Westgate

149

ตัวเลือกการปิดใช้งาน "รูปภาพมีตัวจัดการข้อยกเว้นที่ปลอดภัย" ในคุณสมบัติโครงการ -> คุณสมบัติการกำหนดค่า -> ตัวเชื่อมโยง -> แท็บขั้นสูงช่วยฉันได้


3
สิ่งนี้ไม่มีผลสำหรับฉัน
Pop-A-Stash

เช่นเดียวกันสำหรับฉัน สิ่งที่จับได้ดูเหมือนว่าแม้ว่าฉันจะสามารถเลือก SAFESEH: NO ในเมนูย่อยตัวเลือกขั้นสูงภายใต้การตั้งค่าตัวเชื่อมโยง แต่ก็จะไม่ถูกเลือก มันจะย้อนกลับไปเป็น SAFESEH เสมอ: ใช่
user382459

ประสบความสำเร็จกับ VS 2013 Express
gbarry

1
Success, VS 2015

2
ความสำเร็จ VS 2017
ke4ktz

12

หากคุณได้รับข้อผิดพลาดนี้ขณะสร้าง ZLIB ใน Visual Studio นี่คือวิธีแก้ปัญหา มองหา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ไฟล์ในตัวสำรวจโซลูชันแทน
Cillié Malan

11

วิธีอื่นคือการเพิ่มตัวจัดการ SEH (ตัวอย่างว่างเปล่า) ลงในไฟล์ asm และคอมไพล์ด้วย/safesehตัวเลือกจากนั้นคอมไพล์โค้ดอื่น ๆ ตามปกติด้วย/SAFESEH:YESตัวเลือกคอมไพเลอร์

ตัวจัดการ SEH ที่ว่างเปล่า:

.safeseh SEH_handler

SEH_handler   proc
;handler
ret

SEH_handler   endp

1
ฉันไม่ได้กังวลกับการเพิ่มตัวจัดการไปยังแหล่งที่มาของบุคคลที่สาม (zlib) /safesehดูเหมือนว่าเพียงพอแล้ว สิ่งนี้ควรได้รับการโหวต!
mlt

2
ใครที่มีปัญหาเดียวกันกับ zlib ดูสิ่งนี้ (CTRL + F safeseh) tannerhelland.com/5076/compile-zlib-winapi-wapi-stdcall
codekiddy

ฉันได้เพิ่ม "/ safeseh" ในบรรทัดคำสั่งในคุณสมบัติสำหรับไฟล์. asm และสิ่งนี้ได้ผล
Norbert Boros

0

ระยะทางของคุณอาจแตกต่างกันไป แต่คำแนะนำข้างต้นไม่ได้ผลสำหรับฉัน (แม้ว่าฉันจะไม่ได้ลองใช้เครื่องจัดการข้อยกเว้น asm ของตัวเอง)

สิ่งที่ได้ผลคือการเลือก build target Release / x64

ฉันใช้ Windows 10 บนเครื่อง 64 บิตและใช้ Visual Studio 2015

เป้าหมาย Release / Win32 ก็ใช้ได้เช่นกัน ฉันเดาว่าสิ่งสำคัญคือการเลือก "ปล่อย"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.