13

Hôm nay tôi gặp phải một vấn đề liên kết sau khi cập nhật phiên bản VS 2008-2010, lỗi này là một cái gì đó như thế này:liên kết lỗi sau khi cập nhật từ VS2008 để VS2010

error LNK2019: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" ([email protected][email protected]@@SAXXZ) referenced in function "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::assign(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,unsigned int,unsigned int)" ([email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]) 

error LNK2019: unresolved external symbol "public: static void __cdecl std::_String_base::_Xlen(void)" ([email protected][email protected]@@SAXXZ) referenced in function "protected: bool __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::_Grow(unsigned int,bool)" ([email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]) 

Tôi có googled vấn đề này trên web, và tìm thấy một bài đăng tương tự trong địa chỉ này: http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/5ac28a31-3339-4db1-90f4-68edad360309

Nhưng không có câu trả lời nào trong số này có thể giải quyết được sự cố của tôi. Bất cứ ai có thể cho tôi một số lời khuyên về cách giải quyết vấn đề này?

Cảm ơn bạn rất nhiều vì đã trợ giúp!

+0

Cụ thể cho lỗi mối liên kết này, Xran và Xlen hai chức năng mà tồn tại trong phiên bản VS2008 của std :: basic_string nhưng không tồn tại trong phiên bản VS2010. Vì vậy, khi cố gắng liên kết thư viện này trong VS2010, nó không thể tìm thấy các chức năng này và gọi một lỗi. – Philip

Trả lời

12

Sự cố rất có thể là một trong các thư viện mà tệp .exe của bạn đang liên kết chống lại được tạo bằng phiên bản Visual Studio trước. Bởi vì thư viện "khác" này được biên dịch với phiên bản trước của VS, nó đang tìm kiếm các phiên bản trước của hàm _XRan và _XLen trong thời gian chạy VS2010 C. MS đã thay đổi chúng (một lần nữa) và các chữ ký chức năng cũ không tồn tại trong thời gian chạy VS2010.

cũ: public: static void __cdecl std :: _ String_base :: _ Xran (void)

mới: public: void __thiscall std :: basic_string :: _ Xran (void) (điều này có thể sai, nhưng bạn sẽ có được ý tưởng)

có ba khả năng sửa chữa:

1) biên dịch tất cả các thư viện với VS 2010

2) Sử dụng các phiên bản cũ của VS để biên dịch mã của bạn

3) Viết lại các thực hiện _XRan và _XLen hiện có và ghi đè trong trình liên kết (xem giải thích của JN123 trong http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/5ac28a31-3339-4db1-90f4-68edad360309).

2

Chuyển đến thiết lập dự án của bạn:

tính Cấu hình chung - công cụ nền tảng thiết lập

  1. visual studio 2010 - vc100.
  2. studio trực quan 2008 - vc90.
  3. studio trực quan 2005 - vc80.
+0

Điều này làm gì? Làm thế nào là nó tốt hơn câu trả lời của Jess? Tôi có vấn đề này và không chắc chắn làm thế nào để giải quyết nó. – Tim

1

Chuyển đến thiết lập dự án của bạn:

tính Cấu hình chung - công cụ nền tảng thiết lập

visual studio 2010 - vc100. studio trực quan 2008 - vc90. studio trực quan 2005 - vc80.

Điều này yêu cầu tất cả các phiên bản studio trực quan này được cài đặt trên hệ thống của bạn. Nếu không, bạn sẽ nhận được một lỗi như thế này: "Bộ công cụ nền tảng được chỉ định (v90) yêu cầu Visual Studio 2008. Hãy đảm bảo rằng Visual Studio 2008 được cài đặt trên máy."

2

Đối mặt với cùng một vấn đề di chuyển cho năm 2008 đến 2012. Có vẻ như MS vẫn đang chơi với chữ ký của các hàm này. Quyết định của tôi chỉ là cung cấp cho linker những gì nó muốn.Tôi đã đặt mã sau vào cpp của dự án của tôi và mối liên kết đã bị đóng cửa lên:

namespace std 
{ 
    class _String_base 
    { 
    public: 
     static void _cdecl _Xlen(void) ; 
     static void _cdecl _Xran(void) ; 
    }; 
}; 

void _cdecl std::_String_base::_Xlen(void) 
{ // report a length_error 
_Xlength_error("string too long"); 
} 
void _cdecl std::_String_base::_Xran(void) 
{ // report an out_of_range error 
_Xout_of_range("invalid string position"); 
} 
+0

Điều này làm việc cho tôi. Chỉ phải thêm '#include '. – Lucas

+0

Nó hoạt động! Cảm ơn bạn! – MajesticRa

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