2013-04-13 27 views
7

Tôi đã tạo một giải pháp mới cho zlib 1.2.7, thiết lập nó như một thư viện tĩnh, thêm các tiêu đề cần thiết và các tệp nguồn từ ./zlib/contrib/minizip và nhận nó để biên dịch tốt. Sau đó tôi liên kết nó với libpng (cũng như là một lib tĩnh), cũng biên dịch tốt. Sau đó, tôi liên kết libpng với dự án công cụ đồ họa của tôi (cũng là một thư viện tĩnh) ... vẫn không có lỗi.Bật/tắt SAFESEH trong VC11?

Nhưng ngay sau khi tôi liên kết dự án chính của tôi vào công cụ đồ họa của tôi, tôi nhận được một số lỗi LNK2026 về crc32.obj, deflate.obj, inflate.obj, d3dxplane.obj, d3dxvec4 .obj và các mô-đun liên quan đến zlib/directx khác. Nó nói với tôi rằng họ đang đến từ lib đồ họa động cơ của tôi, vì vậy tôi đã quyết định sửa lỗi này bằng cách thêm /SAFESEH:NO vào cờ liên kết của tôi cho các dự án tương ứng.
LƯU Ý: Tôi có lẽ nên nói rằng tất cả các dự án được đặt để nhắm mục tiêu x86, KHÔNG x64.

Vấn đề, tuy nhiên, hiện tôi đang nhận được:
warning LNK4044: unrecognized option '/SAFESEH'; ignored dẫn đến lỗi LINK2026 tương tự trong dự án chính của tôi.
Nếu tôi mở lời nhắc lệnh phòng thu trực quan và nhập LINK /?, xác nhận rằng /SAFESEH là tùy chọn trình liên kết hợp lệ. Tôi gặp lỗi tương tự khi tôi sử dụng /SAFESEH(không có ': NO') và nếu tôi bỏ qua nó hoàn toàn thì dự án chính của tôi đơn giản từ chối việc xây dựng.

Điều gì đang xảy ra ở đây? Làm thế nào để tôi có được điều này?

Trả lời

12

bằng cách thêm/SAFESH: NO để cờ mối liên kết của tôi

Vâng, bạn viết sai chính tả. Có lẽ trong câu hỏi của bạn, có thể trong cài đặt trình liên kết, loại trùng hợp ngẫu nhiên có xu hướng giải thích lý do tại sao thứ gì đó nên hoạt động không hiệu quả.

Nó có sẵn mà không cần phải gõ nó vào, làm ơn ủng hộ nó theo cách đó.Dự án + Thuộc tính, Trình liên kết, Nâng cao, cuộn xuống bảng bên phải, "Cài đặt Hình ảnh có Trình xử lý ngoại lệ an toàn". Sử dụng combobox để chọn No.

+0

Đó là lỗi đánh máy. Nó được viết đúng là '/ SAFESEH' trong tất cả các dự án. Dự án duy nhất có cài đặt đó là dự án chính của tôi (những người khác nói _Librarian_ thay vì _Linker_ và tùy chọn không tồn tại trong _Librarian -> "All Options" _). Tôi đã thay đổi nó thành _NO_ trong dự án chính của mình và biên dịch và chạy mà không có bất kỳ lỗi nào ... nhưng tôi muốn thay đổi điều này ở mức sâu hơn bằng cách hỗ trợ nó trong lib tĩnh của tôi, để các nhà phát triển bên thứ ba sẽ không bị buộc vô hiệu hóa nó trong các dự án của riêng họ. Điều này có thể không? – RectangleEquals

+0

Chắc chắn, xây dựng lại tất cả các .lib bạn sử dụng. –

+0

Zlib, libpng và công cụ của tôi là những người duy nhất tôi sử dụng (ngoài d3d9.lib & d3dx9.lib, tất nhiên là nguồn đóng) ... và như tôi đã nói, có vẻ như không có cài đặt nào được gọi là "Hình ảnh có Trình xử lý ngoại lệ an toàn" trong bất kỳ hình ảnh nào trong số đó. Do đó, việc xây dựng lại chúng không giải quyết được gì. Và nếu điều đó xảy ra, tôi sẽ biết vì tôi đã luôn xây dựng lại chúng trước khi xây dựng lại dự án chính của tôi. Vì vậy, hoặc là tôi trở lại hình vuông nếu tôi muốn một giải pháp thực sự, hoặc tôi chỉ có thể buộc các dev khác để vô hiệu hóa các tùy chọn trong các dự án của họ. – RectangleEquals

1

Một nhanh chóng google shows điều này cho biết bạn cần phải biên dịch lại các mô-đun vi phạm với cài đặt trình biên dịch thích hợp.

Lưu ý rằng cờ này chỉ hoạt động với mục tiêu x86. Nếu bạn đang nhắm mục tiêu 64 bit, bạn sẽ nhận được lỗi này bất kể.

Ngoài ra, từ http://msdn.microsoft.com/en-us/library/9a89h429(v=vs.80).aspx, có thể có liên quan:

Lý do phổ biến nhất cho các mối liên kết không để có thể tạo ra một hình ảnh là bởi vì một hoặc nhiều tập tin đầu vào (module) cho trình liên kết không tương thích với tính năng xử lý ngoại lệ an toàn. A lý do phổ biến cho một mô-đun không tương thích với ngoại lệ an toàn Bộ xử lý là vì nó được tạo bằng trình biên dịch từ phiên bản trước của phiên bản của Visual C++.

Sẽ rất hữu ích nếu bạn cung cấp số phiên bản trình biên dịch và cách sao chép zlib của bạn (bạn tự xây dựng và nếu có, cùng trình biên dịch?).

+0

Câu đầu tiên trong câu hỏi của tôi nói rằng tôi đã thực sự tự xây dựng nó trong một giải pháp mới và thẻ tiêu đề + cho biết rằng tôi đang sử dụng vc11. Mọi thứ được thực hiện với cùng một phiên bản trình biên dịch. Tôi quên đề cập đến rằng tất cả các dự án được thiết lập để x86, vì vậy tôi sẽ cập nhật câu hỏi của tôi cho việc này. – RectangleEquals

+0

Ngoài ra, bạn có liên kết zlib với bộ tùy chọn '/ SAFESEH' không? –

+1

Có, tôi đã thử trước khi đăng câu hỏi của mình. Tất cả các dự án đều cho tôi cùng một tập hợp các lỗi. Nó giống như/SAFESEH không tồn tại trong trình liên kết của tôi nữa, mặc dù nó nói nó. – RectangleEquals