2013-06-07 45 views
5

CẬP NHẬT: Đây là tất cả về cơ bản không có thật. Nó chỉ ra phiên bản của Depends.exe trên máy nơi ứng dụng chạy là phiên bản 32 bit. Sau khi sửa chữa, cả hai máy đều hiển thị các DLL hệ thống dưới dạng 64 bit, do đó đó không phải là nguồn gốc của sự cố. Không chắc chắn tại sao phụ thuộc cho thấy chúng theo cách đó trong một exe 32 bit.Tại sao QtCreator/MSVC liên kết hệ thống DLL 64 bit với ứng dụng 32 bit của tôi?


THÔNG TIN THÊM: Cuối cùng vấn đề là một DLL 64 bit. Điều này dễ tìm hơn sau khi sử dụng phiên bản chính xác của Dependency Walker. Chọn phiên bản 32 bit 64 bit không dựa trên nền tảng bạn đang chạy. Từ số FAQ:

Phụ thuộc Walker sẽ làm việc với bất kỳ mô-đun Windows 32 bit hoặc 64 bit nào. Có phiên bản 32 bit và 64 bit phụ thuộc Walker. Tất cả các phiên bản đều có khả năng hoặc mở các mô-đun 32 bit và 64 bit. Tuy nhiên, có các ưu điểm chính khi sử dụng Walker phụ thuộc 32 bit để xử lý mô-đun 32 bit và Bộ phụ thuộc 64 bit để xử lý mô-đun 64 bit. Điều này đặc biệt đúng khi chạy trên phiên bản 64 bit của Windows, cho phép thực hiện cả chương trình 32 bit và 64 bit. Hệ thống con 32 bit trên Windows 64 bit (được gọi là "WOW64") có sổ đăng ký riêng riêng, "AppPaths", "KnownDlls", thư mục hệ thống và xử lý tệp kê khai . Chỉ phiên bản 32-bit phụ thuộc Walker mới có thể truy cập môi trường 32 bit này, cần thiết để xử lý chính xác mô-đun 32 bit. Tương tự như vậy, chỉ phiên bản 64 bit phụ thuộc Walker mới có thể truy cập hoàn toàn vào môi trường 64 bit, do đó, nó luôn là được sử dụng để xử lý các mô-đun 64 bit.


Tôi có một ứng dụng được xây dựng một cách chính xác trên một máy và không chính xác trên một số khác. Cả hai đều là MacBook Pros chạy Windows 7 thông qua BootCamp. Chúng đang được xây dựng thông qua QtCreator với VS2010 là công cụ biên dịch/liên kết.

Trên máy A Nó biên dịch và liên kết mà không có bất kỳ lỗi nào được báo cáo. Tuy nhiên, khi chạy nó không thành công với lỗi 0xc000007b (STATUS_INVALID_IMAGE_FORMAT). Depends.exe xác nhận rằng exe là một exe 32 bit nhưng tất cả các tệp DLL Windows (advapi32.dll, vv) được liên kết dưới dạng các tệp DLL 64 bit. Dường như đây sẽ là lỗi thời gian liên kết nhưng dường như không.

Trên máy B, mọi thứ biên dịch và chạy chính xác. Depends.exe xác nhận rằng exe và tất cả các DLL liên kết là 32-bit.

Dự án của tôi Qt được cấu hình như sau:

qmake: qmake.exe PROJECT.pro -r -spec win32-msvc2010 "CONFIG+=declarative_debug" 

tôi tin rằng phần -spec win32-msvc2010 là đủ để xác định một 32 bit build.

Hồ sơ dự án một cách rõ ràng liên kết đến các file lib của Windows nhập khẩu nằm ở: C:/Program Files (x86)/Microsoft SDK/Windows/v7.0A/Lib Tôi đã xác nhận đây là 32 libs chút nhập khẩu . Một dòng LIB + = rõ ràng trong tệp dự án sẽ gọi ra đường dẫn này. Nếu dòng này bị xóa khỏi tệp dự án, thì liên kết sẽ thành công. Vì vậy, tôi không chắc chắn làm thế nào vị trí của hệ thống Windows nhập khẩu libs được quy định trong trường hợp đó.

Tôi đã xác minh với dumpbin nhập .lib được gắn thẻ là 32 hoặc 64 bit. Chúng tôi đang xác định vị trí với 32 libs nhập.

Vì một máy hoạt động và máy khác thì không, tôi tin rằng vấn đề là một trong những cấu hình máy. Do đó, tôi đã xóa và cài đặt lại các công cụ MS từ Máy A:

  • Gỡ cài đặt VS2010, Windows 8 SDK, .NET Framework 4.5, QT Libraries và QtCreator.
  • cài đặt lại tất cả những điều trên, theo thứ tự này:

    1. VS2010
    2. VS2010 SP1
    3. .NET Framework 4.5
    4. Windows 8 SDK
    5. Qt Libraries 4.8.4
    6. QtCreator 2.7.1

Tôi vẫn nhận được một exe 32 bit được liên kết với các DLL 64 bit.

Điều gì có thể gây ra liên kết lạ? Và/hoặc làm thế nào tôi có thể xác định chính xác hơn lý do tại sao nó nghĩ rằng nó nên liên kết đến 64 bit DLLs?

Trả lời

1

Nó không phải là.

trả lời từ văn bản câu hỏi:

này là tất cả về cơ bản không có thật. Nó chỉ ra phiên bản của Depends.exe trên máy nơi ứng dụng chạy là phiên bản 32 bit. Khi sửa chữa, cả hai máy hiển thị các DLL hệ thống là 64 bit, do đó, đó là không phải là nguồn gốc của sự cố.

Cuối cùng, vấn đề là một DLL 64 bit. Việc tìm kiếm trở nên dễ dàng hơn sau khi sử dụng phiên bản chính xác của Phụ thuộc Walker. Chọn phiên bản 32 so với 64 bit không dựa trên nền tảng bạn đang chạy. Từ số FAQ:

Phụ thuộc Walker sẽ làm việc với bất kỳ mô-đun Windows 32 bit hoặc 64 bit nào. Có phiên bản 32 bit và 64 bit phụ thuộc Walker. Tất cả các phiên bản đều có khả năng hoặc mở các mô-đun 32 bit và 64 bit. Tuy nhiên, có các ưu điểm chính khi sử dụng Walker phụ thuộc 32 bit để xử lý mô-đun 32 bit và Bộ phụ thuộc 64 bit để xử lý mô-đun 64 bit. Điều này đặc biệt đúng khi chạy trên phiên bản 64 bit của Windows, cho phép thực hiện cả chương trình 32 bit và 64 bit. Hệ thống con 32 bit trên Windows 64 bit (được gọi là "WOW64") có sổ đăng ký riêng riêng, "AppPaths", "KnownDlls", thư mục hệ thống và xử lý tệp kê khai . Chỉ phiên bản 32-bit phụ thuộc Walker mới có thể truy cập môi trường 32 bit này, cần thiết để xử lý chính xác mô-đun 32 bit.Tương tự như vậy, chỉ phiên bản 64 bit phụ thuộc Walker mới có thể truy cập hoàn toàn vào môi trường 64 bit, do đó, nó luôn là được sử dụng để xử lý các mô-đun 64 bit.

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