2012-05-15 21 views
74

Tôi đang sử dụng Microsoft Visual Studio 2011 Professional Betamô-đun không an toàn cho SafeSEH hình ảnh C++

Tôi cố gắng để chạy OpenCV C++ file (http://opencv.willowgarage.com/wiki/Welcome) mà tôi đã biên soạn sử dụng CMake & Visual Studio biên dịch.

Tuy nhiên khi tôi đi để gỡ lỗi dự án tôi nhận được 600 lỗi nhất trong số đó là:

lỗi LNK2026: mô-đun không an toàn cho SafeSEH hình ảnh.

Dường như các tệp này nằm trong dự án opencv_ffmpeg nhưng tôi không thể tìm thấy chúng, tôi đã xem trang Safe Handler an toàn trên trang trợ giúp của Microsoft nhưng tôi không thể tìm thấy bất kỳ câu trả lời dứt khoát nào.

Tôi đã tự hỏi liệu có ai khác đã gặp phải sự cố này hay không và liệu họ có khắc phục được không.

+10

Điều này xảy ra khi bạn liên kết một obj hoặc lib có chứa mã được tạo ra bởi một sớm phiên bản của trình biên dịch. Mà tất nhiên sẽ là phổ biến nếu bạn tải về một nhị phân cho opencv_ffmpeg thay vì nguồn. Bạn có thể tắt tùy chọn trình liên kết nhưng sau đó bạn sẽ vẫn có sự không tương thích phiên bản CRT có thể byte. Xây dựng lại thư viện từ nguồn. –

+0

Cảm ơn sự giúp đỡ, nó đã làm việc –

+0

@HansPassant Phải làm gì khi không có nguồn? – GregC

Trả lời

53

Từ nhận xét:

Điều này xảy ra khi bạn liên kết một obj hoặc lib có chứa mã được tạo ra bởi một phiên bản cũ của trình biên dịch. Mà tất nhiên sẽ là phổ biến nếu bạn tải về một nhị phân cho opencv_ffmpeg thay vì nguồn. Bạn có thể tắt tùy chọn trình liên kết nhưng sau đó bạn sẽ vẫn có sự không tương thích phiên bản CRT có thể byte. Xây dựng lại thư viện từ nguồn. - Hans passant 15 tháng 5 tại 13:01

Thanks for the help, nó làm việc - Aaron Thompson 17 tháng 5 tại 14:50

+0

Nó cũng có thể được gây ra bởi, như các trạng thái lỗi, các mô-đun mà trình liên kết không thể tìm thấy trình xử lý ngoại lệ an toàn. Mô-đun ngôn ngữ hội đồng nói riêng - như được thảo luận trong các câu trả lời khác. Có một số thông tin về điều này [ở đây] (https://docs.microsoft.com/en-nz/cpp/build/reference/safeseh-image-has-safe-exception-handlers). –

111

tùy chọn vô hiệu hóa "Hình ảnh có xử lý ngoại lệ an toàn" trong bất động sản dự án -> Thuộc tính cấu hình -> Trình liên kết -> Tab nâng cao đã giúp tôi.

+3

Điều này không có hiệu lực đối với tôi. –

+0

Tương tự như vậy đối với tôi. Việc bắt giữ có vẻ là, mặc dù tôi có thể chọn SAFESEH: NO trong menu con Tùy chọn Nâng cao trong cài đặt trình liên kết, nó sẽ không được chọn. Nó luôn luôn trở lại SAFESEH: CÓ. – user382459

+0

Thành công, với VS 2013 Express – gbarry

6

Cách khác là thêm một số trình xử lý SEH (ví dụ trống) vào tệp asm và biên dịch chúng với tùy chọn /safeseh, sau đó biên dịch mã khác bình thường với tùy chọn biên dịch /SAFESEH:YES.

rỗng xử lý SEH:

.safeseh SEH_handler 

SEH_handler proc 
;handler 
ret 

SEH_handler endp 
+1

Tôi không bận tâm việc thêm trình xử lý vào nguồn của bên thứ 3 (zlib), '/ safeseh' có vẻ đủ. Điều này thực sự nên được upvoted! – mlt

+2

Bất kỳ ai có cùng vấn đề với zlib đều thấy điều này (CTRL + F safeseh) http://www.tannerhelland.com/5076/compile-zlib-winapi-wapi-stdcall/ – codekiddy

0

Mileage của bạn có thể thay đổi, nhưng không ai trong số những gợi ý ở trên làm việc cho tôi (mặc dù tôi đã không cố gắng lăn xử lý ngoại lệ asm của riêng tôi).

Công việc đã làm là chọn mục tiêu xây dựng Release/x64.

Tôi đang chạy Windows 10 trên một máy 64-bit, và sử dụng Visual Studio 2015.

Mục tiêu Phát hành/Win32 hoạt động, quá. Tôi đoán điều chính là chọn "Release".

4

Nếu bạn gặp lỗi này trong khi xây dựng ZLIB trong Visual Studio thì đây là giải pháp.Hãy tìm contrib\masmx86\bld_ml32.bat và thêm /safeseh như một lựa chọn

Trước

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

Sau

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