2010-10-11 23 views
8

Tôi gặp sự cố khi liên kết dự án C++ trong VS2008 khi sử dụng tùy chọn biên dịch /clr. Tôi nhận được lỗi sau xây dựng:LNK2022 Lỗi khi sử dụng/clr

Class1.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEA): (0x0200046f). 
Class1.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEW): (0x02000473). 
Class2.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEA): (0x0200046f). 
Class2.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEW): (0x02000473). 
Class3.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEA): (0x0200046e). 
Class3.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEW): (0x02000472). 
Class4.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEA): (0x0200046e). 
Class4.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEW): (0x02000472). 
Class5.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEA): (0x0200046e). 
Class5.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEW): (0x02000472). 
Class6.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEA): (0x0200046e). 
Class6.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEW): (0x02000472). 
LINK : fatal error LNK1255: link failed because of metadata errors 

Tôi không có ý tưởng gì PROPSHEETPAGEAPROPSHEETPAGEW đang đề cập đến. Tôi đã kiểm tra trực tuyến để xem mô tả của Microsoft về lỗi này nhưng tôi không biết nó có ý nghĩa gì. http://support.microsoft.com/kb/324088

Để giải quyết vấn đề này, thêm định danh duy nhất khi bạn sử dụng phần mở rộng cho C++ Managed để bạn tránh sử dụng các cấu trúc vô danh như biến toàn cục.

Microsoft đã xác nhận rằng đây là lỗi trong các sản phẩm của Microsoft được liệt kê ở đầu bài viết này. Lỗi này đã được sửa chữa trong Microsoft Visual C++ .NET (2003).

Bất kỳ ý tưởng nào cũng sẽ được đánh giá cao.

EDIT

Sau khi thực hiện một ildasm trên Class1.obj tôi trích ra hai thông điệp:

// TypeDef #1134 (0200046f) 
// ------------------------------------------------------- 
// TypDefName: _PROPSHEETPAGEA (0200046F) 
// Flags  : [NotPublic] [SequentialLayout] [Class] [Sealed] [AnsiClass] [BeforeFieldInit] (00100108) 
// Extends : 0100000B [TypeRef] System.ValueType 
// Layout : Packing:0, Size:56 
// CustomAttribute #1 (0c0012a0) 
// ------------------------------------------------------- 
//  CustomAttribute Type: 0a000003 
//  CustomAttributeName: Microsoft.VisualC.MiscellaneousBitsAttribute :: instance void .ctor(int32) 
//  Length: 8 
//  Value : 01 00 41 00 00 00 00 00       > A    < 
//  ctor args: (65) 
// 
// CustomAttribute #2 (0c0012a1) 
// ------------------------------------------------------- 
//  CustomAttribute Type: 0a000001 
//  CustomAttributeName: Microsoft.VisualC.DebugInfoInPDBAttribute :: instance void .ctor() 
//  Length: 4 
//  Value : 01 00 00 00          >    < 
//  ctor args:() 
// 
// CustomAttribute #3 (0c0012a2) 
// ------------------------------------------------------- 
//  CustomAttribute Type: 0a000004 
//  CustomAttributeName: System.Runtime.CompilerServices.NativeCppClassAttribute :: instance void .ctor() 
//  Length: 4 
//  Value : 01 00 00 00          >    < 
//  ctor args:() 


// TypeDef #1138 (02000473) 
// ------------------------------------------------------- 
// TypDefName: _PROPSHEETPAGEW (02000473) 
// Flags  : [NotPublic] [SequentialLayout] [Class] [Sealed] [AnsiClass] [BeforeFieldInit] (00100108) 
// Extends : 0100000B [TypeRef] System.ValueType 
// Layout : Packing:0, Size:56 
// CustomAttribute #1 (0c0012b0) 
// ------------------------------------------------------- 
//  CustomAttribute Type: 0a000004 
//  CustomAttributeName: System.Runtime.CompilerServices.NativeCppClassAttribute :: instance void .ctor() 
//  Length: 4 
//  Value : 01 00 00 00          >    < 
//  ctor args:() 
// 
// CustomAttribute #2 (0c0012b1) 
// ------------------------------------------------------- 
//  CustomAttribute Type: 0a000001 
//  CustomAttributeName: Microsoft.VisualC.DebugInfoInPDBAttribute :: instance void .ctor() 
//  Length: 4 
//  Value : 01 00 00 00          >    < 
//  ctor args:() 
// 
// CustomAttribute #3 (0c0012b2) 
// ------------------------------------------------------- 
//  CustomAttribute Type: 0a000003 
//  CustomAttributeName: Microsoft.VisualC.MiscellaneousBitsAttribute :: instance void .ctor(int32) 
//  Length: 8 
//  Value : 01 00 41 00 00 00 00 00       > A    < 
//  ctor args: (65) 

Tôi không chắc chắn những gì tất cả điều này có nghĩa, nhưng có vẻ như nếu mục thứ hai là giống với đầu tiên ngoại trừ các thuộc tính được định nghĩa ngược.

+0

Tôi đã sửa đổi thiết lập giải pháp để chứa tất cả mã được quản lý trong một dự án duy nhất thay vì nhiều dự án và lỗi đã biến mất. Nó sẽ mãi mãi là một bí ẩn ... – lumberjack4

Trả lời

4

Tôi đã có cùng một vấn đề chính xác ngay hôm nay đối với một trong các dự án của tôi. Tôi đã giải quyết nó bằng cách sắp xếp lại các tệp tiêu đề của tôi. Vấn đề là tôi đã di chuyển một tập tin tiêu đề vào đầu của tập tin cpp, trước khi tập tin đã được bao gồm windows.h. Vì vậy, khi tôi hoàn nguyên thứ tự bao gồm và đặt windows.h trở lại ở đầu tệp cpp, nó đã sửa mọi thứ.

sửa lỗi rất khó, nhưng nó đã hiệu quả đối với tôi.

+0

Đây là một liên kết đến MSDN mà loại giải thích những gì đang xảy ra. http://msdn.microsoft.com/en-us/library/aa712965(VS.71).aspx –

1

Có vẻ như bạn đang làm một cái gì đó như thế này:

struct 
{ 
    int a; 
    int b; 
} global_struct; 

đó là vô danh. Nếu bạn thay đổi nó thành:

struct UniqueNameHere 
{ 
    int a; 
    int b; 
} global_struct; 

nên sửa lỗi.

+1

Tôi không thấy kịch bản này bật lên bất cứ nơi nào trong mã của tôi. – lumberjack4

+0

PROPSHEETPAGEA và PROPSHEETPAGEW là cấu trúc Windows. Nó trông giống như tiêu đề mà các cấu trúc này được định nghĩa (prsht.h) không hoạt động tốt trong các dự án dựa trên CLR. Có một cơ hội mà tiêu đề này đang được bao gồm khi nó không cần phải được? Bạn có thể phải tổ chức lại mã để loại trừ các tiêu đề không cần thiết bởi dự án trong giải pháp của bạn. –

1

Tôi đã có cùng một vấn đề ngày hôm nay, di chuyển dự án của tôi từ vs2008 đến vs2010. Trong khi soạn thảo một dự án CLI liên kết với C++ libs khác, tôi đã nhận lỗi liên kết này trên:

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> >): (0x0200004f). 
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). 

tôi đã cố gắng ildasm như các tài liệu đề nghị, nhưng không thể tìm thấy bất kỳ định nghĩa kiểu đó có vẻ giống nhau nhưng có một tên gọi khác nhau .

hơn nữa, tôi phải nói rằng tôi không hoàn toàn hiểu lỗi này. Thực tế là hai lỗi xuất hiện có nghĩa là có hai vấn đề khác nhau với cả hai loại (chuỗi char và chuỗi wchar) hoặc có nghĩa là có một vấn đề mà hai loại này đang gây ra. Ý nghĩa của các con số ở cuối dòng (tôi đã tìm thấy hai typedefs trên bản ghi ildasm với những con số này, mặc dù). Không có gì về điều đó trong tài liệu.

BTW - cùng các dự án biên dịch cấu hình và liên kết hoàn hảo với vs2008.

Dù sao, bị mất trong bóng tối, tôi đã chuyển C++ lib khác của tôi, liên kết với dự án CLI, thành một dự án CLI (biên dịch với cờ/clr). relinking dự án CLI chính dường như giải quyết vấn đề. Bằng cách nào đó, thêm hỗ trợ clr hoặc liên kết với clr giải quyết sự va chạm kiểu này.

Nếu ai đó có giải thích giáo dục về vấn đề này, tôi rất thích đọc nó.

1

Tôi đã phải đối mặt với cùng một loại vấn đề, nhưng sau này tôi thấy rằng lớp được hiển thị trong lỗi đã được bao gồm hai lần. Tôi đã lưu trữ tập tin tiêu đề lớp chính của tôi vào thư mục dự án của tôi cho mục đích sao lưu, và bản gốc đã nằm trong thư mục bao gồm của dự án của tôi. Điều này xảy ra vì tôi đã đưa hai đường dẫn thư mục này vào thuộc tính "Bao gồm đường dẫn tệp bổ sung" của dự án của tôi.

0
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> >): (0x0200004f). 
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). 

Lỗi này chỉ xuất hiện trong phiên bản gỡ lỗi, đó là một loại lỗi trình biên dịch. Để khắc phục nó, bạn có thể chuyển đổi thiết

Configuration Properties\C/C++\Code Generation\Runtime Library 

dự án từ

MultiThreaded Debug Dll (MDD) 

để MultiThreaded Dll (MD) (đối với DLL). Nhưng sau đó bạn sẽ gặp vấn đề với việc gỡ lỗi mã này (ví dụ với các điểm ngắt)

Một cách khác là loại bỏ các lớp stl bằng mã hỗn hợp: hoàn toàn trong dự án, hoặc một phần: chia dự án của bạn thành thuần túy Stl classes) và các phần hỗn hợp, tạo các header khác được biên dịch sẵn cho chúng, tắt/clr cho toàn bộ dự án, và chỉ bật nó cho cpp với mã hỗn hợp.

3

Tôi đã giải quyết vấn đề này đơn giản bằng cách thực hiện "sạch" trên toàn bộ solutuion. Dường như điều này chỉ có thể xảy ra nếu VS trộn lẫn mọi thứ.

0

Trong trường hợp của tôi, tuyên bố một lớp phụ thuộc vào một số #define được khai báo trong .h (kiểm tra #ifdef) mà tôi quên đưa vào một trong các tệp sử dụng nó. Trong mối liên kết kết quả có 2 mô tả khác nhau của lớp. Trong trường hợp này, hãy kiểm tra tất cả các tệp có chứa tệp liên quan có khai báo có điều kiện.

0

Trong một trong những dự án phụ thuộc stdafx.h không chứa khai báo như sau:

#ifndef WINVER   // Allow use of features specific to Windows XP or later. 
#define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows. 
#endif 

Kết quả là khác nhau prsht.h tập tin biên soạn trong nhiều dự án.

Trong tên tệp này được khai báo cấu trúc bằng _PROPSHEETPAGE.

VS 2008

-1

Tôi cũng gặp sự cố này gần đây. Có vẻ như trước khi tôi làm một hình thức làm việc của mình, tôi đã tạo ra một biểu mẫu khác nhưng đã xóa nó đi. Nhưng bằng cách nào đó một trong những tập tin .cpp của nó vẫn còn. Cho đến khi tôi nhận thấy nó, tôi đã có lỗi này. Khi tôi gỡ bỏ tệp .cpp của biểu mẫu đã xóa, biểu tượng đã biến mất.

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