Sửa lỗi Runtime R6034: ứng dụng đã cố gắng tải thư viện thời gian chạy C không chính xác?


8

Tôi vừa tải xuống QGIS 2.0 và mỗi lần mở, tôi nhận được cửa sổ thông báo lỗi này bật lên:

Lỗi thời gian chạy R6034

Có ai biết điều này có nghĩa là gì hoặc làm thế nào tôi có thể sửa nó không?


2
Hệ điều hành gì? Trông giống như Windows 7 (64 bit). Vui lòng xác nhận.
Mapperz

1
Lỗi tương tự ở đây, trên Win 7 64 bit, cài đặt độc lập (không thông qua OSGEO4W). Lỗi này xảy ra mỗi khi tôi khởi chạy QGIS 2, ngay cả khi đóng, nó không làm phiền QGIS, người hoạt động tốt.
RobinC

2
Đây là một vấn đề đã biết với bản dựng 64 bit của QGIS tại thời điểm này. Bạn có thể bỏ qua nó bây giờ chúng tôi đang cố gắng sửa nó.
Nathan W

Tôi có hệ thống 64 bit, rất vui vì đó là một lỗi đã biết! cảm ơn bạn!
Cuck

@NathanW Vui lòng thêm câu trả lời khi trình cài đặt được sửa để chủ đề này có thể được đóng lại. Cảm ơn!
underdark

Câu trả lời:


8

Tôi đã gặp vấn đề tương tự khi sử dụng V2.2.0 của QGis và nó đã gây khó chịu cho tôi trong một thời gian, vì vậy cuối cùng tôi đã loay hoay nghiên cứu vấn đề này và tìm hiểu xem nó là gì.

Trước khi tôi đi xa hơn, tôi muốn bày tỏ rằng cách khắc phục này có thể không hiệu quả với bạn, có vẻ như đây là một trong những lỗi đó, trong đó các lý do cơ bản cho vấn đề là như nhau, nhưng mỗi trường hợp có một chút sắc thái tinh tế khác nhau.

Trong trường hợp của tôi, tôi bắt đầu với bài viết SO xuất sắc được tham chiếu trong câu trả lời đầu tiên. Là một nhà phát triển MS đầy đủ bằng thương mại, tôi có cảm giác ruột thịt rằng đó là một loại xung đột RTL với mscvrt chứ không phải là một vấn đề thực sự của QGis (Một phần vì tôi cũng đã thấy hành vi tương tự trong các ứng dụng khác)

Sau khi tiếp cận vấn đề đường dẫn như được mô tả trong bài đăng khác và không nhận được giải pháp, tôi bắt đầu khám phá thêm bằng cách sử dụng trình thám hiểm quy trình và điều này dẫn tôi đến con đường nhận ra rằng QGis thực tế đang cố gắng tải hai bản sao riêng biệt từ hai các vị trí khác nhau của tệp 'msvcr90.dll'

Sau khi nhận ra điều này, tôi đã chuyển bản sao msvcr90.dll trong thư mục windows \ system32 của mình sang một vị trí sao lưu cách xa ổ đĩa hệ thống chính của tôi và chạy lại QGis.

Lúc này tôi đã gặp một lỗi khác, một người phàn nàn rằng một DLL yêu cầu bị thiếu.

Đưa tệp trở lại trong system32 và thử lại, đã sửa lỗi này, nhưng đã mang lại lỗi thời gian chạy C ban đầu.

Sau khi di chuyển msvcr90 dll trở lại vị trí an toàn, sau đó tôi đã sử dụng một số công cụ SDK / Developer của windows để theo dõi biểu đồ phụ thuộc của DLL đã tải

Sau khi thực hiện điều này, một chút châm chọc trong trình thám hiểm quy trình, cho tôi thấy rằng QGis cũng đang tải 'msvcp100.dll' và 'msvcr100.dll' từ thư mục riêng của mình và rằng một hoặc cả hai DLL này đều phụ thuộc tĩnh vào ' tập tin msvcr90.dll 'trong thư mục system32 của tôi.

Sau khi kiểm tra nhanh để đảm bảo rằng tôi đã cài đặt toàn bộ hệ thống tiêu chuẩn của cả 3 DLL vào đúng vị trí (Thư mục windows winxs) Tôi cũng đã di chuyển 2 tệp đó từ thùng QGis sang vị trí sao lưu.

Sau đó, tôi đã sao lưu QGis 2.0.2 sao lưu và xin chào, mọi thứ khởi động và hoạt động mà không có bất kỳ thông báo lỗi nào.


Bây giờ một chút lý thuyết cho những người quan tâm

Tại sao điều này chỉ thể hiện chủ yếu trên các hệ thống 64 bit?

Vâng, nó phải làm với cách các cửa sổ quản lý lớp tương thích một cách ngắn gọn.

Bạn thấy 'c: \ windows \ system32' KHÔNG phải vì bạn sẽ tin vào một thư mục hệ thống 32 bit.

Đối với bất cứ ai nhớ đến những ngày vinh quang của windows, khi tất cả những gì bạn phải lo lắng là windows 95/98, mọi thứ đều là 32 bit và cuộc sống rất tốt.

Sau đó, khi các máy mạnh hơn xuất hiện và chúng tôi bắt đầu nhận được hệ điều hành 64 bit, mọi thứ bắt đầu hơi rắc rối.

'Công cụ' 32 bit có thể dễ dàng chạy trên 64 bit và chỉ sử dụng một nửa băng thông, nhưng 'công cụ' 64 bit không thể chạy trên 32 bit mà không nhân đôi mọi thứ trong một quy trình gọi là 'Thunking' (MS cũng mắc lỗi tương tự khi đi từ 16 Bit Win 3.11 đến Win 95 cũng với gói bổ trợ Win32S xấu số - nhưng đó là một câu chuyện cho một thời điểm khác)

Theo trí tuệ vô hạn của họ và để duy trì 'Khả năng tương thích với phần mềm cũ', MS thay vì thực hiện mọi thứ theo cách hợp lý và có thư mục 'System64' cũng như thư mục 'System32' đã quyết định làm mọi thứ ngược lại một chút.

Thay vào đó, những gì họ quyết định làm là đặt TẤT CẢ các thành phần 64 bit vào một thư mục có tên 'system32', lý do đằng sau điều này là các ứng dụng 32 bit có hành vi xấu và có đường dẫn mã hóa cứng, vẫn chạy trên 64 bit hệ thống, và sẽ tải và sử dụng các thành phần HĐH 64 bit mà không thực sự nhận ra nó.

Trong khi đó, tất cả các công cụ 32 bit được đặt trong một thư mục có tên 'SysWOW64', được chuyển hướng trong suốt bởi các cuộc gọi nhân hệ điều hành nội bộ khi một ứng dụng 32 bit thực sự hoạt động tốt bằng các cuộc gọi HĐH hợp pháp yêu cầu một DLL 32 bit thực tế, để phục vụ 32 bit DLL từ bộ sưu tập các tệp 32 bit.

Chuyển hướng này được gọi là '64 Bit Windows trên Lớp tương thích Windows X32 'do đó có tên syswow64

Bây giờ điều này là tốt, khi nó hoạt động và không bị lạm dụng.

Beacuse của sự lạm dụng này (kéo dài qua thời kỳ địa ngục DLL của Win XP) MS đã đưa ra một phương pháp cải tiến mới khi windows Vista được phát hành có tên là 'Lớp tương thích của Windows bên cạnh' (Họ yêu thích các lớp tương thích của họ không phải: - ))

Điều này chứng kiến ​​sự ra đời của thư mục 'wonxs và ý tưởng thật đơn giản

Trong thư mục này, bạn đặt một 'Liên kết cứng' (Có mọi người, NTFS có thể thực hiện các liên kết cứng và mềm giống như * nix có thể), Liên kết cứng này sẽ trỏ đến DLL thích hợp cần thiết để vận hành chính xác phần mềm đó trên nền tảng đó.

Trong trường hợp của chúng tôi, các thời gian chạy trực quan c ++ bây giờ được cài đặt trong một thư mục không có đường dẫn và sau đó được liên kết với thư mục winxs, các cửa sổ sau đó nhìn vào ứng dụng gọi DLL một cách trong suốt, chỉ ra rằng đó là 32 hoặc 64 bit và chuyển hướng cuộc gọi đến DLL thích hợp bất cứ nơi nào nó có thể được cài đặt.

thư mục winxs (nếu bạn đủ can đảm để xem nó) sẽ có một mục nhập cho mọi thời gian chạy và / hoặc .net trên PC của bạn cho mọi nền tảng được hỗ trợ bởi thời gian chạy đó và phần lớn hoạt động rất tốt trong hầu hết thời gian.

Đó là, cho đến khi một ứng dụng mất trí nào đó được mã hóa cứng để tìm system32 đi và bỏ đi 32 bit trong cái mà nó tin là 'thư mục hệ thống 32 bit', thường ghi đè lên phiên bản 64 bit trong quá trình, sau đó tạo liên kết winxs đối với cả hai phiên bản nền tảng của thời gian chạy C ++ trực quan đều chuyển sang phiên bản 32 bit, thay vì phiên bản 32/64 bit tùy thuộc vào những gì được yêu cầu.

Kết hợp điều này với thực tế là một lần nữa để hỗ trợ khả năng tương thích, các tìm kiếm dựa trên đường dẫn LUÔN LUÔN được ưu tiên hơn các cuộc gọi dựa trên SysWOW & wonxs, sau đó có một dll ở sai vị trí có thể có nghĩa là cả một thế giới đau đớn.

Trong trường hợp của msvcrt ?? nó thực sự quản lý để 'Thunk' phiên bản 32 bit thành không gian địa chỉ 64 bit và tiếp tục hoạt động (Đó là lý do tại sao QGis không thực sự gặp sự cố khi khởi động), nhưng điều này có thể dẫn đến các sự cố sau này (Chẳng hạn như sự cố ứng dụng ngẫu nhiên tôi gặp phải nhận được trong khi chạy) do ứng dụng nhầm tưởng thời gian chạy có thể xử lý giá trị 64 bit.

Tuy nhiên, nhiều ứng dụng khác có thể từ chối khởi động hoàn toàn khiến người dùng gặp phải một thông báo lỗi chung chung khó hiểu mà hoàn toàn không giúp khắc phục vấn đề.

Dù sao, tôi biết đó là một cuốn tiểu thuyết tôi đã viết ở đây, nhưng vì vẫn còn nhiều người gặp phải vấn đề này, hy vọng bây giờ bạn đã trang bị kiến ​​thức cần thiết để khắc phục nó.

chỉ cần nhớ rằng, điều này không phải vì sự yếu đuối của trái tim, sự lộn xộn của bạn với các hệ điều hành bên trong đây, vì vậy, HÃY ĐỂ bạn sao lưu mọi thứ trước khi bạn bắt đầu thay đổi mọi thứ.

Tôi không thể nhấn mạnh điều này đủ, nếu bạn mắc lỗi, có khả năng bạn có thể làm cho hệ thống của mình không khởi động được. Phải thừa nhận rằng tôi vẫn chưa thấy điều này xảy ra, đặc biệt khi các DLL liên quan chỉ là thư viện thời gian chạy C ++, nhưng rủi ro vẫn còn nếu bạn vô tình thay đổi hoặc di chuyển các tệp DLL sai.



1

Câu trả lời của Shawty là tuyệt vời và giúp tôi xác định vấn đề của mình. Process Explorer là phạm vi phù hợp và việc giết một số thư mục từ đường dẫn của tôi là viên đạn ma thuật. (Tức là loại bỏ Intel iCLS và SDK OpenCL của Intel khỏi đường dẫn hệ thống của tôi). Vui lòng xem thêm câu trả lời của Michael Cooper và các bình luận liên quan cũng như các câu trả lời khác về SO:

/programming/14552348/r nb-error-r6034-in-embedded-python-application/31012118#31012118

(Mặc dù liên kết sau cũng nằm trong phản hồi SO ...) Process Explorer là bản tải xuống miễn phí tại:

https://technet.microsoft.com/en-ca/sysiternals/bb896653.aspx

R6034 là một lỗi khó chịu, mơ hồ. Có vẻ như nó thường bị thiếu / xấu / mâu thuẫn msvcr90.dll (tệp thời gian chạy C ++).


0

Giải pháp cho tôi là như sau:

  • Tôi nhận thấy tôi đã cài đặt QGIS 32 bit. Tuy nhiên máy của tôi là 64 bit.
  • Tôi gỡ cài đặt QGIS và xóa sổ đăng ký (Chạy "regedit.exe") và xóa thư mục QGIS (Tôi không chắc bước này có cần thiết không. PS: Nếu bạn làm vậy, bạn sẽ mất tất cả các plugin QGIS bạn đã cài đặt ) nhập mô tả hình ảnh ở đây
  • Cuối cùng, tôi đã cài đặt phiên bản QGIS 64 bit. Hậu quả là lỗi R6034 biến mất.
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.