5

Tôi có một dự án cũ được biên dịch trong VS2005 (Đáng buồn thay). Nó vẫn còn trong VS2005 để nó có thể liên kết đúng với một quá trình khác có VS2005 CRT, MFC, v.v.Lỗi liên kết khi cố gắng biên dịch đối với thư viện STD cũ và các cửa sổ SDK

Bây giờ tôi cần biên dịch dự án này trong VS2015, sử dụng bộ công cụ VS2005 cũ.
Tôi đã thay đổi thư mục VC++ của dự án thành các thư mục cũ cho tất cả tiêu đề STD và Windows SDK (Bao gồm thư mục, Thư mục tham khảo, Thư mục thư viện, Thư mục nguồn).

Thủ thuật này sử dụng để hoạt động tốt khi làm việc với VS2010, nhưng trên VS2015 tôi nhận được một số lỗi liên kết kỳ lạ:

1>Project1.obj : error LNK2019: unresolved external symbol "void __stdcall `eh vector destructor iterator'(void *,unsigned int,unsigned int,void (__thiscall*)(void *))" ([email protected]@[email protected]) referenced in function "public: virtual void * __thiscall PluginInterface::`vector deleting destructor'(unsigned int)" (??_E[email protected]@[email protected]) 
1>  1> 
1>StdAfx.obj : error LNK2001: unresolved external symbol "void __stdcall `eh vector destructor iterator'(void *,unsigned int,unsigned int,void (__thiscall*)(void *))" ([email protected]@[email protected]) 
1>  1> 
1>Project1.obj : error LNK2019: unresolved external symbol "void __cdecl operator delete(void *,unsigned int)" ([email protected]@Z) referenced in function [email protected]@@[email protected]$0 
1>  1> 
1>Project1.obj : error LNK2019: unresolved external symbol "void __cdecl operator delete[](void *,unsigned int)" ([email protected]@Z) referenced in function "public: virtual void * __thiscall PluginInterface::`vector deleting destructor'(unsigned int)" ([email protected]@[email protected]) 

Tại sao nó tìm kiếm thực hiện bên trong này của deleter? Nó có nên được thực hiện từ các tiêu đề? Tại sao nó hoạt động trong VS2010 chứ không phải VS2015?

Làm cách nào để khắc phục sự cố này đúng cách?

+0

Bạn đã thử đặt thuộc tính đầu vào của trình liên kết để bỏ qua các thư viện mặc định? – Mahesh

+0

Có, và nó chỉ làm cho nó tồi tệ hơn. Những biểu tượng đó đã bị mất tích cùng với một loạt những người khác. –

+1

Đây là những hàm trợ giúp được tạo tự động, Raymond Chen nói về chúng trong [bài đăng blog cũ này] (https://blogs.msdn.microsoft.com/oldnewthing/20040203-00/?p=40763). Tên của họ đã thay đổi, bây giờ là tiền tố "eh" với tên của họ. Tôi đoán nó có một cái gì đó để làm với hành vi mới yêu cầu cho các * static * từ khóa trong C + + 11. Không phải cái gì bạn có thể tắt, biên dịch mà không có/EH là hầu như không một workaround vì vậy bạn đang khá nhiều hơi say. –

Trả lời

1

Vì vậy, sau khi đọc rất nhiều thay đổi phá vỡ các tài liệu tôi tìm thấy một lá cờ mà có thể ngăn chặn những C++ mới 14 delete triển khai here, dưới Vị trí mới và xóa.

Thêm cờ /Zc:sizedDealloc- xóa toán tử xóa() hiện tại của toán tử.
tính Project -> Configuration Properties -> C/C++ -> Command Line ->/Zc: sizedDealloc-

bạn có thể trở lại các hành vi cũ bằng cách sử dụng các tùy chọn trình biên dịch /Zc: sizedDealloc -. Nếu bạn sử dụng tùy chọn này, chức năng xóa hai đối số không tồn tại và sẽ không gây xung đột với vị trí của bạn toán tử xóa.

Đối với lỗi eh vector destructor iterator Tôi đã opened a separate questionanswered it there.

Các vấn đề liên quan