2008-12-01 45 views
7

Tôi đã tạo một dự án DLL trong VS 2005 cho native Win32/unmanaged C++, gọi nó là myProj.dll. Nó phụ thuộc vào một DLL thương mại của bên thứ ba mà lần lượt phụ thuộc vào msvcr90.dll (tôi giả sử nó được xây dựng từ một dự án VS 2008). Tôi sẽ gọi nó là thirdParty.dll.msvcr90.dll phụ thuộc vào dự án VS 2005 C++

Dự án DLL của tôi xây dựng tốt trong VS2005. Tôi đã xây dựng một ứng dụng thử nghiệm (một lần nữa, VS 2005 Win32 C++) liên kết đến myProj.lib. (Là một sang một bên, đánh giá bởi kích thước nhỏ của .lib, và bởi thực tế là, tại thời gian chạy, ứng dụng phải xác định vị trí myProj.dll, tôi đoán rằng .lib chỉ là một wrapper cho một cuộc gọi đến loadLibrary() tải các DLL thực tế, là đóng?)

Vấn đề của tôi là, tại thời gian chạy, ứng dụng thử nghiệm không thể xác định vị trí msvcr90.dll (cũng không phải msvcp90.dll), phụ thuộc vào đó bắt nguồn từ thirdParty.dll.

Tôi đã cài đặt gói redist của Microsoft, và vì vậy có tất cả thư viện std (9.0) C++ trong c: \ WINDOWS \ WinSxS \ x86_Microsoft.VC90.CRT _.... Hơn nữa, nếu tôi chỉ phụ thuộc vào walker tại thirdParty.dll, nó vui vẻ giải quyết các tham chiếu đến vị trí đó.

Nhưng, nếu tôi điểm depends.exe tại ứng dụng thử nghiệm của tôi (.exe) hoặc myProj.dll, msvcr90.dll và msvcp90.dll không tìm thấy.

Tôi đoán có điều gì đó tôi cần định cấu hình trong VS2005 để tệp .exe hoặc myProj.dll nhận biết vị trí của phiên bản 9.0 của thư viện std C++ (có lẽ là nơi gói được cài đặt lại trong C: \ WINDOWS \ WinSxS), nhưng tôi không thể tìm ra nó là gì. Có phải tôi đang trên đường ray bên phải không? Tôi lưu ý rằng, nếu tôi chỉ đơn giản là sao chép các tập tin msvc * 90.dll vào thư mục ứng dụng của tôi, thì phụ thuộc được giải quyết, nhưng tôi gặp lỗi thời gian chạy về tải không đúng std C++ DLL, v.v.

Cảm ơn rất nhiều trước.

Trả lời

1

Tôi sẽ hỏi bên thứ ba về mọi người.

+0

Có lẽ đó là cách tốt nhất. Tuy nhiên có thể có thứ gì đó bị hỏng. Nếu đúng như vậy, hãy thử cài đặt cửa sổ sạch (vmware). Bằng cách đó bạn có thể viết ra mọi thứ bạn đang làm để giải thích cho họ các bước để tái tạo vấn đề này. – wimh

+0

Cảm ơn, Wimmel. Vâng, đó là những gì tôi đang nghĩ tôi sẽ làm hôm nay. Và, tôi cũng liên lạc với các bên thứ ba. Nhân tiện, một điều tôi bỏ qua là có một thành phần thứ ba - một thư viện được liên kết tĩnh (.lib) từ một bên thứ ba khác. Nó bao gồm các clib. –

+0

(giới hạn ký tự ngớ ngẩn!) ... và vì vậy tôi buộc phải xây dựng myProj.dll với/MT (d) (một lần nữa, với VS2005). –

2

Bạn đã cài đặt SP1 version của danh sách redvc 2008? Nó không phải là một vấn đề nếu depends.exe không thể tìm thấy các msvcr90.dll, nếu bạn sử dụng trình cài đặt microsoft nó sẽ tự động được cài đặt ở vị trí chính xác, và sẽ được tìm thấy nếu ứng dụng của bạn được chạy. Quay Lại Đầu Trang | Nó không giúp đỡ nếu bạn sao chép các dll vào thư mục ứng dụng của bạn nếu bạn không tạo một tệp kê khai.

Nhưng bạn có thể cho biết thông báo lỗi chính xác mà bạn nhận được không?

Bạn cũng có thể xem herehere liên quan đến tệp kê khai.

+0

Tôi đã cài đặt phiên bản SP1 của bản sửa lỗi msvc 2008. Thông báo lỗi chính xác là "ứng dụng đã không khởi động được vì không tìm thấy msvcr90.dll. Cài đặt lại ứng dụng ..." Điều này xảy ra khi tôi tạo một ứng dụng sử dụng myProj.dll. –

+0

Có thể chủ đề này: http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/6d16ecce-f92b-4c53-a45b-40119c4566a6/ có thể cung cấp cho bạn một số thông tin để giải quyết vấn đề. – wimh

6

Điều này có vẻ giống như một vấn đề "Side-by-Side Assemblies" đối với tôi.

Từ những gì tôi có thể nói, Microsoft trong nỗ lực dừng các vấn đề DLL Hell trong những năm qua đã đưa ra khái niệm về "Hội đồng song song".

Trong một nut shell nó có nghĩa là ứng dụng của bạn cần phải nói của Windows mà phiên bản của CRT nó được thiết kế để làm việc với. Khi ứng dụng được cài đặt, Windows sẽ đảm bảo rằng ứng dụng của bạn nhận được bản sao riêng tư của các tệp DLL này.

Để làm cho nó tất cả việc bạn cần phải nhúng DLL phụ thuộc của ứng dụng vào các ứng dụng Manifest tập tin và gắn nó vào dự án bằng cách sử dụng Manifest Tool, Input và Output phần của các thiết lập dự án ứng dụng.

Như một ví dụ ở đây là biểu hiện tôi sử dụng cho các Zeus for Windows IDE:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity 
     name="Xidicone.Windows.Zeus for Windows" 
     version="3.9.6.69" 
     processorArchitecture="X86" 
     type="win32" /> 

    <description>Zeus for Windows</description> 

    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity 
      type="win32" 
      name="Microsoft.VC80.CRT" 
      version="8.0.50608.0" 
      processorArchitecture="x86" 
      publicKeyToken="1fc8b3b9a1e18e3b" /> 
    </dependentAssembly> 
    </dependency> 

    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity 
      type="win32" 
      name="Microsoft.Windows.Common-Controls" 
      version="6.0.0.0" 
      processorArchitecture="X86" 
      publicKeyToken="6595b64144ccf1df" 
      language="*" /> 
    </dependentAssembly> 
    </dependency> 
</assembly> 

Cuối cùng, nếu bạn có kế hoạch để thực hiện một cài đặt bạn sẽ cần phải thêm các phiên bản tương tự của những tập tin DLL cho trình cài đặt ứng dụng hoặc theo cách khác, trình cài đặt của bạn chạy trình cài đặt có thể phân phối lại của Microsoft CRT.

FWIW Tôi chỉ phát hiện ra điều này khi người dùng báo cáo rằng Zeus không còn chạy trên Windows XP vì thiếu tệp DLL thời gian chạy MSVCRT, tuy nhiên Zeus đã hoạt động tốt trong hơn 10 năm mà không bao giờ phải giao hàng Tệp DLL thời gian chạy MSVCRT.

+0

Tôi đã thử sao chép nội dung của tệp kê khai từ thư mục redisted VS 2008 vào một tệp trong thư mục dự án của tôi, sau đó chỉ ra rằng đó là tệp "manifest file" trong thuộc tính manifest của dự án của tôi. vấn đề. –

+1

user42279 "đã thử sao chép nội dung". Bạn cũng phải đảm bảo rằng các chi tiết có trong tệp kê khai cũng chính xác. Đây là chi tiết của tệp kê khai xác định cách chương trình được tải và chạy, vì vậy nếu các chương trình này không chính xác thì chương trình sẽ không chạy. – high5

0

Tôi gặp vấn đề tương tự vài ngày trước. myProj.dll phụ thuộc vào một thirdParty.dll, sử dụng msvcr90. Nếu tôi xây dựng một test.exe bằng cách sử dụng myProj.dll trực tiếp, nó là ok. Nhưng nếu tôi sử dụng loadLibrary (myProj.dll) trong test.exe, cuộc gọi sẽ thất bại. Điều tương tự cũng xảy ra nếu tôi thử loadLibrary (myProj.dll) trong một chương trình Java.

Sau một số điều tra và nghiên cứu trên Internet, các bước sau đã giải quyết được sự cố của tôi.

  1. Đảm bảo rằng KHÔNG có msvcr90 trên PATH. Bạn có thể sử dụng quá trình thám hiểm (procexp.exe của SystemInternals) để tìm ra tất cả msvcr90 hiện đang được tải trong môi trường của bạn. Như một vấn đề của thực tế, bắt đầu từ VC 2005, C thư viện thời gian chạy chỉ nên được cài đặt trong bộ đệm ẩn toàn cầu (\ winsxs ....), thậm chí dưới cửa sổ, hoặc windows \ system32.

  2. nhúng tệp kê khai dll vào myProj.dll. Sau khi cl.exe và link.exe tạo myProj.dll, một tệp kê khai tương ứng cũng được tạo ra. Sau đó sử dụng mt.exe -inputresource myProj.dll.manifest out myProj.dll; 2

ở trên giải quyết vấn đề của tôi, hy vọng rằng nó có thể là của bất kỳ sự giúp đỡ cho bạn. BTW, tôi đang sử dụng VC 2008 trong Windows 2008 R

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