2008-08-08 37 views
6

Tôi đã mở một không gian làm việc cũ là libray và bộ phận thử nghiệm của nó. Nó được sử dụng để làm việc tốt nhưng bây giờ không và các phiên bản cũ của mã không hoạt động hoặc với cùng một lỗi. Tôi đã thử tạo lại dự án và cũng gây ra các lỗi tương tự. Không có gì dường như không đúng thứ tự trong cài đặt dự án và mã được tạo ra hoạt động trong ứng dụng chính.Các sự cố liên kết (VC6)

Tôi đã loại bỏ hầu hết các tệp và giảm xuống mức tối thiểu để tạo lỗi. Rất tiếc, tôi không thể đăng dự án vì điều này được sử dụng trong mã sản xuất.

Lỗi liên kết LNK2001 tôi thường gặp có nghĩa là tôi đã rời khỏi thư viện hoặc quên triển khai chức năng ảo. Tuy nhiên, đây là một phần của thư viện mẫu chuẩn - và là một tiêu đề ở đó.

Các mã được liệt kê như là có vấn đề trong IOCompletionPort.obj không thực sự sử dụng std::string trực tiếp, nhưng không gọi một lớp có quyền này: Comms::Exception chấp nhận một std::string và giá trị của GetLastError hoặc WSAGetLastError.

Hàm được đề cập trong lỗi (GetMessage) được triển khai, nhưng là một hàm ảo để các lớp khác có thể ghi đè lên nếu cần. Tuy nhiên nó xuất hiện rằng trình biên dịch đã làm cho nó như là một phiên bản Ansi, nhưng tôi không thể tìm thấy bất kỳ tùy chọn trong các thiết lập mà sẽ kiểm soát đó. Tôi nghi ngờ rằng có thể là vấn đề nhưng vì có rất ít trong cách lựa chọn cho thư viện tôi không có cách nào để biết chắc chắn. Tuy nhiên cả hai dự án chỉ định _MBCS trong các tùy chọn trình biên dịch.

-------------------- Cấu hình: TestComms - Win32 Gỡ lỗi ------------------ - Liên kết ... Comms.lib (IOCompletionPort.obj) : lỗi LNK2001: biểu tượng bên ngoài chưa được giải quyết "công khai: lớp ảo std :: basic_string, class std :: allocator> __thiscall Comms :: Ngoại lệ :: GetMessageA (void) const "(? GetMessageA @ Ngoại lệ @ Comms @@ UBE? AV? $ basic_string @ DU? $ char_traits @ D @ std @@ V? $ allocator @ D @ 2 @@ std @@ XZ) Gỡ lỗi/TestComms .exe: lỗi nghiêm trọng LNK1120: 1 bên ngoài chưa được giải quyết Lỗi khi thi hành link.exe.

TestComms.exe - 2 lỗi (s), 0 cảnh báo (s)

Bất kỳ lời đề nghị? Tôi đã mất hầu hết buổi sáng và không muốn mất hầu hết buổi chiều.

Trả lời

4

Một khả năng nằm với Win32 ANSI/Unicode "mang tên", biến biểu tượng GetMessage thành GetMessageA hoặc GetMessageW. Có ba khả năng:

  1. windows.h chưa được nạp, vì vậy GetMessage vẫn GetMessage

  2. windows.h đã được nạp với các biểu tượng thiết lập cho ANSI, vì vậy GetMessage trở thành GetMessageA

  3. Windows.h đã được tải với các ký hiệu được đặt cho Unicode, vì vậy GetMessage trở thành GetMessageW

Nếu bạn đã biên dịch hai tệp khác nhau theo các cách kích hoạt hai kịch bản khác nhau, bạn sẽ gặp lỗi liên kết.Thông báo lỗi chỉ ra rằng lớp Comms::Exception là một ví dụ của # 2, ở trên - có lẽ nó được sử dụng ở đâu đó mà windows.h chưa được tải?

điều khác tôi muốn làm ở vị trí của bạn, cũng giống như một vấn đề của thói quen:

1) Đảm bảo rằng tôi bao gồm đường dẫn và thư viện không chứa bất cứ điều gì mà tôi không mong đợi.

2) Thực hiện "xây dựng sạch" và sau đó tự xác minh, xóa bất kỳ tệp đối tượng thừa nào nếu cần.

3) Đảm bảo không có bất kỳ đường dẫn mã cứng nào trong các câu lệnh bao gồm không có nghĩa là ý nghĩa của chúng khi dự án ban đầu được xây dựng lại.

EDIT: Chiến đấu với định dạng :(

0

windows.h được khai báo ở đầu IOCompletionPort.h như một bao gồm - Tôi phát ốm vì thấy 7 dòng chỉ để bao gồm 1 tập tin vì vậy tôi đã quấn nó của nó Điều này cũng chứa một số #defines bổ sung (tức là ULONG_PTR) vì ứng dụng chính của chúng tôi sẽ không biên dịch với SDK nền tảng được cài đặt :-(

  1. Điều đó được xác nhận.
  2. Tôi đã làm điều đó - đã xóa các thư mục xây dựng
  3. Tôi không bao giờ sử dụng đường dẫn mã hóa cứng.
0

Giả sử bạn chưa futzed xung quanh với các thiết lập dự án xóa một cái gì đó anh nên không có (đó là nơi tôi mong đợi phụ thuộc bên ngoài như User32.lib được):

Kiểm tra Tools | Tùy chọn | Thư mục | Thư viện (đi từ bộ nhớ ở đây) và đảm bảo rằng bạn không bỏ lỡ các thư mục lib phổ biến trong tất cả các vườn (một lần nữa, không có VC6 trước mặt tôi, tôi không thể cho bạn biết chúng là gì)

1

@Curt : Tôi nghĩ bạn đến gần nhất. Tôi chưa thử nghiệm điều này nhưng tôi nghĩ tôi đã trả lời câu hỏi ban đầu của mình.

GetMessage là một định nghĩa trong Windows.h được bao bọc trong khối ifndef để chuyển đổi giữa Ansi (GetMessageA) và Unicode (GetMessageW).

0

Đây là vấn đề chung với cách Microsoft xử lý các API ANSI và Unicode. Vì chúng là tất cả (hoặc khá nhiều) được thực hiện bằng cách định nghĩa các macro cho các tên hàm giải quyết cho các phiên bản 'A' hoặc 'W' của các tên hàm, bạn không thể có một định danh an toàn trong namespace/class/struct/enum/chức năng phù hợp với tên Windows API.

Macro windows.h chạy thô trên tất cả các không gian tên khác.

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