2011-11-11 32 views
5

Tôi đang xây dựng một ứng dụng sau khi chuyển đổi không gian làm việc VC++ 6 trên Visual C++ 2008 express. Xây dựng trong bản thân đi thành công nhưng vấn đề thực sự tôi có là với các biểu hiện tạo ra mà trông như thế này:Cách phân phối các thư viện C thời gian chạy (CRT)

<?xml version='1.0' encoding='UTF-8' standalone='yes'?> 
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
     <requestedPrivileges> 
     <requestedExecutionLevel level='asInvoker' uiAccess='false' /> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.30729.1' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' /> 
    </dependentAssembly> 
    </dependency> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' /> 
    </dependentAssembly> 
    </dependency> 
</assembly> 

Câu hỏi của tôi là:

Làm thế nào tôi có thể hạn chế các biểu hiện liệt kê chỉ ONE phiên bản, tốt nhất là 9.0. 21022.8. sao cho tôi có thể bó các phụ thuộc thời gian C-Run cần thiết trong ứng dụng của tôi?

Tôi biết nguyên nhân gốc rễ có thể xảy ra đối với vấn đề này là phụ thuộc vào một số thư viện sử dụng 9.0.21022.8 và VC++ Express 2008 của tôi có thể sử dụng 9.0.30729.1. đó là lý do tại sao cả hai được liệt kê là phụ thuộc.

Lưu ý:

Tôi đang theo phương pháp b) của http://www.codeproject.com/Tips/211756/How-to-Distribute-C-run-time-CRT-Libraries-with-Yo?display=Print mà nói về việc sao chép các tập tin DLL CRT và tập tin Microsoft.VCXX.CRT.manifest bên trong thư mục ứng dụng.

+0

Bạn cần khắc phục điều đó. Có, xây dựng lại tất cả libs với cùng một cài đặt trình biên dịch. –

+0

Hơn nữa để Hans bình luận, nó có giá trị đọc [this] (http://www.nuonsoft.com/blog/2008/10/29/binding-to-the-most-recent-visual-studio-libraries/) mà nói bạn một chút về việc kiểm soát phiên bản của thư viện mà mã của bạn liên kết. – tinman

+0

Cảm ơn @tinman, liên kết được đăng bởi bạn đã giúp giải quyết vấn đề của tôi. – amit

Trả lời

9

Giá trị mặc định cho Visual Studio 2008 là liên kết với phiên bản 9.0.21022.8. Đây là bất kể phiên bản gói dịch vụ hoặc hotfix bạn đã cài đặt, vì bản cập nhật cho Visual Studio không nhất thiết buộc ứng dụng của bạn phải nâng cấp (như được mô tả here).

Các phiên bản có thể khác là 9.0.30729.1 cho Gói dịch vụ 1 hoặc 9.0.30729.6161 cho SP1 với bản cập nhật bảo mật. Co nhung nguoi khac.

Do hành vi mặc định, có thể ứng dụng của bạn đang sử dụng 9.0.21022.8 và có thư viện đã được biên dịch để sử dụng 9.0.30729.1. Bạn có thể tìm hiểu những gì phiên bản của mỗi thư viện phụ thuộc vào bằng cách sử dụng dòng lệnh sau (described here):

dumpbin /directives <name>.lib 

Để control the version của thời gian chạy ứng dụng của bạn liên kết với bạn có thể xác định những biểu tượng tiền xử lý trong cài đặt dự án của bạn (phải là trong các thiết lập dự án hoặc trên dòng lệnh) hoặc là ràng buộc với phiên bản mặc định (9.0.21022.8 - bằng cách không định nghĩa chúng) hoặc ràng buộc với cùng phiên bảnnhư Visual Studio của bạn được cài đặt:

_BIND_TO_CURRENT_VCLIBS_VERSION=1 

Rõ ràng bạn cũng có thể chỉ định e xact phiên bản bạn muốn liên kết với việc sử dụng các định nghĩa từ this answer (có lẽ tôi nên đã tìm thấy rằng đầu tiên trước khi gõ tất cả điều này :).

Nếu bạn thấy ứng dụng của mình liên kết với 9.0.30729.1 và thư viện phụ thuộc ràng buộc với 9.0.21022.8 thì bạn chỉ cần xóa định nghĩa tiền xử lý.

Khó khăn khác là khi bạn nâng cấp Visual Studio, các mô-đun hợp nhất thời gian chạy trong thư mục redistributable của bạn cũng được nâng cấp lên các phiên bản đó. Vì vậy, nếu bạn có một dự án thiết lập sử dụng những mô-đun hợp nhất và bạn đang cố gắng liên kết với phiên bản mặc định, bạn sẽ kết thúc việc cài đặt các phiên bản mới của các thời gian chạy.

Giải quyết phiên bản thời gian chạy sẽ không thành vấn đề nếu bạn cũng phân phối các mô-đun hợp nhất chính sách thời gian chạy, vì trình tải thư viện sẽ xem xét chính sách thời gian chạy của bạn và tự động tải phiên bản mới nhất ngay cả khi bạn liên kết với mặc định phiên bản. Ngay cả với các hội đồng tư nhân bộ nạp will first look in the WinSxS folder vì vậy nếu các chính sách ở đó, bạn sẽ liên kết với phiên bản mới nhất.Vì vậy, số phiên bản hỗn hợp trong tệp kê khai của bạn sẽ chuyển hướng đến phiên bản mới nhất.

Đôi khi điều đó không được mong muốn và bạn có thể kiểm soát điều đó để buộc nó chỉ tải phiên bản trong tệp kê khai mà bạn chỉ định, được giải thích trong câu trả lời cho this similar SO question.

+0

+ Tiền thưởng: Tuyệt vời. –

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