Thiếu bản dựng phát hành Qt 5.12 của dll


0
  • Máy Windows 7
  • QtCreator 4.8.0
  • Qt 5.12.0
  • MSVC2015 64-bit
  • Trình biên dịch MSVC C ++ 14.0 (x86_amd64)

Tôi đang cố gắng tạo ra một chương trình rất đơn giản mà tôi muốn chia sẻ với các đồng nghiệp của mình. Họ không cài đặt Qt và cần phải có một tệp thực thi. Tôi đã không thành công vì exe có nhiều phụ thuộc mà tôi không thể tìm thấy.

Để gỡ lỗi, tôi đã bắt đầu từ đầu với Ứng dụng Qt Widgets mà không làm gì cả(tức là chỉ tệp tiêu đề, main.cpp và mainWindow.cpp). Khi tôi chạy chương trình trong QtCreator, nó sẽ xây dựng thành công và thoát với mã 0. Một thực thi được tạo và bằng cách chạy Windeployqt, tất cả các dll của Qt cần thiết được sao chép vào thư mục. Tuy nhiên, các cửa sổ dll bị thiếu. Sử dụng walker phụ thuộc tôi có thể thấy rằng toàn bộ danh sách các cửa sổ dll bị thiếu. Tôi không hiểu tại sao rất nhiều dll được yêu cầu cho một chương trình không có gì. Tôi có thể tìm thấy một số dll trong thư mục x64 \ ilc \ lib \ MSCRT \, nhưng hầu hết các API-MS-WIN-CORE-xxx-xxx.dll yêu cầu đều không khả dụng. Tôi đã đọc các bài viết về các vấn đề tương tự nhưng không thể liên quan đến các giải pháp được đề xuất cho tình huống của tôi. Bất kỳ lời khuyên nào cũng được đánh giá cao, đó là một máy tính xách tay làm việc, do đó cài đặt lại windows không phải là một lựa chọn.

đã chỉnh sửa Khi chạy tệp thực thi Qt .... (liên kết đến ảnh chụp màn hình bên dưới) Thông báo lỗi đầu tiên

Thông báo lỗi thứ hai, sau khi bao gồm VCRUNTIME140_APP.dll

Đầu ra từ công cụ phụ thuộc


1
Dependency Walker sẽ phàn nàn về các API-MS-*tập tin ngay cả khi bạn có chúng trên hệ thống. "Tôi không hiểu tại sao rất nhiều dll được yêu cầu cho một chương trình không có gì." - Chương trình của bạn không thực sự yêu cầu những tập tin đó.
Ramhound

Thật không may, tập tin thực thi Qt cũng yêu cầu các dll này. Tôi đã chỉnh sửa bài đăng ở trên và bao gồm ảnh chụp màn hình để hiển thị thông báo lỗi đầu tiên. Sau đó, tôi đã sao chép VCRUNTIME140_APP.dll vào thư mục và nhận được thông báo lỗi thứ 2. Tại thời điểm này tôi không thể tiến hành vì dll được yêu cầu không có trên hệ thống của tôi.
danny99

Câu trả lời:


1

Những DLL này trong thời gian của họ cũng khiến tôi phải gãi đầu, vì vậy tôi tận dụng cơ hội để phơi bày bí ẩn này một lần và mãi mãi.

Các API-MS-*DLL không thực sự thiếu - vấn đề là ở walker phụ thuộc. Các DLL giả này đã được thêm vào trong Windows Vista có từ năm 2007, trong khi phiên bản phụ thuộc có từ năm 2006 và không bao giờ được cập nhật kể từ đó.

Nirsoft đã phân tích các DLL này và đã chỉ ra rằng chúng rất nhỏ và về cơ bản không chứa mã hữu ích. Khi Windows tải chúng, các mục nhập của chúng được thay thế bằng các lệnh gọi đến các hàm thực trong nhân Windows.

Bài viết về API-MS-WIN-XXXXX.DLL và người phụ thuộc khác Walker Glitches gọi họ bằng tên của "Bộ Api" và đưa ra viễn cảnh lịch sử này:

Đôi khi trong chu kỳ phát triển của Vista, một nỗ lực được gọi là MinWin đã bắt đầu: về cơ bản, những người thông minh bắt đầu di chuyển chức năng xung quanh với hy vọng đơn giản hóa kiến ​​trúc HĐH. Để bảo vệ vô số thành phần khỏi bị phá vỡ trong một thay đổi, giải pháp cuối cùng được gọi là: thêm một lớp cảm ứng. Cấp độ này chính xác là Bộ Api.

Ví dụ, tập API api-ms-win-core-fibers-l1-1-1.dlllà một 'nguyên tử' của các chức năng bao gồm 5 API FlsAlloc, FlsFree, FlsGetValue, FlsSetValueIsThreadAFiber(nó là một untypically nhỏ như vậy 'nguyên tử'). Tất cả các ứng dụng sử dụng chức năng sợi đều khai báo sự phụ thuộc vào bộ API này và do đó trở nên không nhạy cảm với vị trí thực hiện chính xác (có thể thay đổi giữa các bản phát hành HĐH). Trong thời gian tải, HĐH sẽ tìm kiếm ở đâu đó và tự động định tuyến các cuộc gọi từ api-ms-win-core-fibers-l1-1-1.dll bất cứ nơi nào chúng được thực hiện trong phiên bản HĐH này.

Dữ liệu chuyển hướng trên mỗi phiên bản hệ điều hành thực tế nằm trong một tệp đặc biệt được gọi ApiSetSchema.dll. Về mặt kỹ thuật, đó là một DLL (phù hợp với thông số PE), nhưng không phải là tệp thực thi - dữ liệu chuyển hướng nằm trong một phần chuyên biệt được gọi .apiset, được đề cập tại các apiset.hmacro. Sebastien Renaud đã thực hiện một số công việc đảo ngược ngoạn mục và mô tả bố cục của dữ liệu chuyển hướng mà nó chứa.

Một phiên bản hiện đại hơn của walker phụ thuộc, cũng miễn phí, có thể được tìm thấy trong Github Dependencies , và thực hiện công việc tốt hơn là vạch mặt các DLL này:

nhập mô tả hình ảnh ở đây


Đầu vào của bạn làm rõ mọi thứ khá nhiều, đặc biệt là walker phụ thuộc wrt (tôi rất mới đối với lĩnh vực này). Tuy nhiên, tệp thực thi (cái không làm gì cả!) Cũng yêu cầu các dll này. Tôi mới chỉ đi đến lỗi thứ 2, không thể xử lý vì dll này không tồn tại trên hệ thống của tôi (afaik). Bài gốc được chỉnh sửa và ảnh chụp màn hình được thêm ở trên.
danny99

Bạn có nghĩ rằng đây có thể là một vấn đề cụ thể của Qt và có lẽ tôi nên đăng câu hỏi này lên một diễn đàn cụ thể của Qt?
danny99

Không, không có vấn đề gì ở đây, ngoại trừ việc sử dụng một chương trình cổ xưa như máy tập đi phụ thuộc. Sử dụng sản phẩm Phụ thuộc mới hơn ở trên và bạn sẽ không gặp vấn đề gì, hoặc chỉ cần bỏ qua các thông báo này nếu bạn muốn tiếp tục với máy đi bộ phụ thuộc cũ. Trình đi bộ phụ thuộc cũ sẽ đưa ra các cảnh báo giả này trên hầu hết mọi chương trình Windows trên thế giới.
harrymc

Hiểu. Tôi không còn nhìn vào walker walker, chỉ là bản thân tệp thực thi yêu cầu các tệp này khi tôi cố chạy nó. Cập nhật Chỉ cần chia sẻ các tệp nguồn chương trình với một đồng nghiệp và yêu cầu anh ta tạo một tệp thực thi. Nó hoạt động tốt, được tạo thực thi, không yêu cầu thêm windows dll. Anh ta đang chạy windows 10 và một phiên bản Earleir của Qt. Tôi sẽ chuyển sang một phiên bản trước đó và có một phiên bản khác.
danny99

Những DLL nào bị thiếu? Sử dụng Phụ thuộc Github cho danh sách thực tế các DLL bị thiếu.
harrymc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.