2012-08-16 28 views
13

Tôi đang gặp một lỗi mối liên kết mới đối với tôi trong một dự án tôi đang làm việc với:LNK2022 hoạt động siêu dữ liệu: thông tin bố trí không phù hợp trong các loại trùng lặp

1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std.basic_string<char,std::char_traits<char>,std::allocator<char> >): (0x0200004e). 
1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std.basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >): (0x02000075). 
1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std._String_iterator<char,std::char_traits<char>,std::allocator<char> >): (0x02000091). 
1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std._String_const_iterator<char,std::char_traits<char>,std::allocator<char> >): (0x02000092). 
1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std._String_val<char,std::allocator<char> >): (0x02000097). 
1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std._String_val<wchar_t,std::allocator<wchar_t> >): (0x02000099). 

Chúng tôi đang sử dụng Visual Studio 2010 trong Windows 7.

Dự án này được sử dụng để biên dịch. Đó là một trình bao bọc C++/CLI DLL xung quanh một số mã không được quản lý, và do đó bao gồm Hỗ trợ thời gian chạy ngôn ngữ chung. Điều có thay đổi là một thư viện tĩnh bên ngoài mà chúng tôi liên kết đã được "cập nhật". Chúng tôi hiện đang gặp lỗi này khi chúng tôi cố gắng biên dịch dự án liên kết với nó.

"trợ giúp" của Microsoft cho vấn đề này là "chạy ildasm –tokens trên tệp đối tượng để tìm loại có mã thông báo được liệt kê trong error_message và tìm sự khác biệt". Sau đó, tôi đã kiểm tra this page và nhận thấy rằng tùy chọn /tokens chỉ hợp lệ đối với các tệp .exe và .dll ... nhưng đây là lỗi liên kết, vì vậy tệp .dll của tôi chưa được tạo!

Tôi đã thử chạy những thứ như ildasm -tokens AssemblyInfo.obj, nhưng điều duy nhất xảy ra là một cửa sổ mở ra với thông báo lỗi vô cùng hữu ích này:

Thanks Microsoft

Cảm ơn Microsoft!

Tôi không thực sự chắc chắn cách tiếp tục khắc phục sự cố này. Bản phát hành Bản phát hành hoạt động đúng cách - chỉ có Debug bị rối tung. Vì vậy, ở đâu đó trong hỗn hợp, tôi đoán loại std::string có kích thước khác hoặc một cái gì đó ...

Bất kỳ ý tưởng nào?

+3

Thỉnh thoảng tôi nhận được lỗi này khi tôi thay đổi một tập tin tiêu đề, và trình biên dịch không biên dịch lại tất cả các tệp mã mà nó cần. Bạn có thể đã làm được điều này, nhưng việc xây dựng lại toàn bộ và sạch sẽ có thể hữu ích. –

+0

@DavidYaw Cảm ơn bạn đã giới thiệu - Tôi đã và đang xây dựng lại hoàn toàn mà không thành công. Tôi nghĩ rằng tôi đang trên đường mòn của một cái gì đó ở đây mặc dù ... – aardvarkk

Trả lời

13

Được rồi, vì vậy tôi đã giải quyết! Có another SO question thực sự là một trợ giúp lớn. Nó kết thúc liên kết với số this article, có chi tiết hơn một chút về vấn đề. Về cơ bản nó là một số vấn đề với các chuỗi thư viện chuẩn được biên dịch trong cả hai mã được quản lý và không được quản lý. Giải pháp là chỉ cho phép CLR trên các tệp yêu cầu nó. Cụ thể, đây là những gì tôi đã làm:

  1. Removed switch /clr mà áp dụng cho các toàn bộ dự án
  2. chọn hai .cpp file mà thực sự cần thiết CLR, và tự chọn /clr dưới C/C++ -> General -> Common Language RunTime Support.
  3. Đã chuyển toàn bộ dự án thành Program Database /Zi từ Program Database for Edit and Continue /ZI. Điều này đã loại bỏ cảnh báo, bởi vì tôi nghĩ rằng hỗ trợ /clr xuất hiện để vô hiệu hóa liên kết gia tăng, và sau đó mã gốc của tôi đã ném cảnh báo vì nó đang cố gắng sử dụng Chỉnh sửa và Tiếp tục.
  4. sau đó tôi có một số ExtensionAttribute cảnh báo, mà tôi cố định bằng cách làm theo các hướng dẫn trên this page, hiệu quả thêm công tắc sau đây để /clr file -enabled tôi: /clr:nostdlib /AI"%ProgramFiles%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
  5. Trong Debug xây dựng, tôi đã vô hiệu hóa một loạt các tùy chọn gỡ lỗi trên /clr các tệp đã bật. Cụ thể, dưới C/C++ -> Code Generation, tôi đặt Enable Minimal Rebuild thành No (/RM-)Basic Runtime Checks đến Default. Điều này cũng đã loại bỏ một loạt cảnh báo.
  6. Trong bản dựng Gỡ lỗi và Bản phát hành, hãy đặt Enable C++ Exceptions thành No trên clr các tệp đã bật.

Hy vọng điều này sẽ hữu ích!

+0

Tôi đang gặp vấn đề tương tự, nhưng trong trường hợp của tôi, tham chiếu đến cũng phải nằm trong tệp được quản lý (trừ khi chúng tôi thay đổi API của mình). Có cách nào khác xung quanh vấn đề này không? – Kohanz

+1

Điều duy nhất tôi có thể khuyên bạn nên cố gắng chia nhỏ mã được quản lý/không được quản lý của bạn thông qua việc sử dụng thư viện được liên kết động, có lẽ? Điều này xảy ra để làm việc cho tôi, nhưng tôi không chắc chắn như thế nào nó generalizes ... – aardvarkk

+0

Tôi đã làm điều này đã (nhưng đó là một mẹo tốt dù sao). Như bạn đã thấy, tôi đã nhầm lẫn liên kết thư viện được quản lý với các thư viện không được quản lý không cần thiết, không cần thiết gây ra LNK2022. – Kohanz

2

Dường như Visual Studio của tôi ở trạng thái bị hỏng. Tôi là người duy nhất nhận được lỗi đó. Tôi không có thay đổi. Tôi kiểm tra lại dự án ở bên cạnh và nó đã được sửa. Có thể đó là sự cố với tệp người dùng của tôi.

+0

Trong trường hợp của tôi, tôi vừa nâng cấp .vcxproj lên VS2015 sau khi đã xây dựng nó trước đó trong VS2013. Clean -> Rebuild đã sửa nó. –

+0

Đối với tôi chỉ cần xây dựng lại làm việc ... –

1

Việc sửa chữa đối với tôi là để thiết lập Configuration Properties -> C/C++ -> Mã Generation -> Struct Member Alignment -> 16 Bytes (/ Zp16)

+0

giải pháp này giải quyết một vấn đề tương tự của tôi, cụ thể là các tuyên bố lĩnh vực không nhất quán trong các loại trùng lặp – Aak

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