Nếu mã được biên dịch bởi trình biên dịch C++ trực quan là thẳng C++, tại sao bạn cần một gói redistributable? Điều này có làm cho nền tảng mã của bạn phụ thuộc không? Có sử dụng trình biên dịch C++ trực quan với gói redistributable cung cấp bất kỳ lợi thế nào khi sử dụng một IDE khác cùng với g ++ không?Tại sao gói Visual C++ Redistributable được yêu cầu?
Trả lời
Mã không phụ thuộc nền tảng, kết quả thực thi là. Nó được liên kết với các thư viện MS với việc thực hiện thư viện chuẩn, được bao gồm trong redistributable như của DLL.
IIRC nên có tùy chọn liên kết tĩnh mọi thứ, vì vậy bạn sẽ không cần phân bổ lại, nhưng kết quả nhị phân vẫn sẽ phụ thuộc vào nền tảng - ví dụ: bạn không thể chạy nhị phân cửa sổ trên UNIX hệ thống (không có RƯỢU ít nhất).
Bạn có thể lựa chọn bao gồm trình quản lý bộ nhớ, thư viện I/O tiêu chuẩn, chẳng hạn như một bản sao riêng trong mọi ứng dụng, không có cách nào tốt để quản lý và nâng cấp nó cũng như cài đặt một lần chạy thời gian chứa tất cả mã đó một lần cho mọi ứng dụng có thể cần. –
@DavidSchwartz yeah ... Và tôi nghĩ rằng nó bao gồm theo mặc định với tất cả các cài đặt Windows anyway, là nó phải không? – littleadv
Tùy thuộc vào cài đặt Windows và thời gian chạy nào. Một cài đặt mới của Windows Vista SP1, ví dụ (nếu có ai vẫn cài đặt) sẽ không có thời gian chạy VS2010. –
Không có điều nào như "Thẳng C++". Sẽ luôn có một số hàm thư viện mà bạn đang gọi ở đây và trong mã của bạn, và thậm chí nếu bạn rất cẩn thận, sẽ có một số hàm cần được gọi đơn giản bằng mã được trình biên dịch phát ra. Ví dụ: nếu bạn có vòng lặp sau:
for(int i = 0; i < count; i++)
array1[i] = array2[i];
Trình biên dịch sẽ thay thế bằng mã chỉ sao chép bộ nhớ. Và nếu bạn đang biên soạn cho kích thước nhỏ hơn thay vì tốc độ, điều này sẽ là một cuộc gọi đến một chức năng rất giống như memmove().
Ngoài ra, bạn có thể có một số thao tác dấu phẩy động mà không tồn tại các hướng dẫn tương đương x86 trực tiếp; chúng cũng sẽ được thực hiện với các cuộc gọi hàm. Và danh sách được tiếp tục.
Điều này không làm cho nền tảng của bạn phụ thuộc, bởi vì trên nền tảng khác, trình biên dịch của plafrom đó sẽ biên dịch cùng mã của bạn để đi với bất kỳ thời gian chạy C++ nào cho nền tảng đó.
May mắn thay, thời gian chạy C++ không phải là một thực thể riêng biệt khỏi ứng dụng của bạn. Kiểm tra các tùy chọn trình biên dịch và trình liên kết của bạn; bạn sẽ có thể tạo ra một tệp thực thi duy nhất chứa cả hai. Nếu bạn thấy rằng g ++ không yêu cầu một thời gian chạy riêng biệt, đó là vì nó thực hiện chính xác theo mặc định.
C++ Redistributable là đặc trưng cho IDE mà bạn đang sử dụng ("IDE" tôi nói, nhưng đó là thực sự cụ thể để trình biên dịch, nhưng trình biên dịch IDE & đều được gán các phiên bản mới như điều di chuyển dọc.)
Nó được làm đặc biệt cho IDE đó, nhưng không được sử dụng cho hệ điều hành Win. Vì vậy, nó phải tương thích ngược (giả sử bạn không sử dụng các API mới, rõ ràng.) Trên thực tế, điều này được thực hiện để nó tương thích ngược (và không phải là cách khác khi bạn đang suy nghĩ.) Điều này cho phép bạn sử dụng phiên bản IDE lớn nhất (10, 11, 12 ...) và vẫn chạy mã của bạn trên Win2k!
Bây giờ, tất nhiên, nó khác nhiều so với Linux, nơi bạn dự kiến sẽ biên dịch lại trên mỗi phiên bản chính. Hầu hết các hệ thống Unix sẽ hoạt động theo cách đó.
Tôi không biết cách nào để biên dịch C++ tĩnh để có thể tránh những phân phối lại đó. Nó có thể là có thể, mặc dù nó chắc chắn sẽ làm cho exe của bạn rất lớn.
Tôi luôn giữ bản sao Visual C++ 6 được cài đặt trên Máy ảo xp (Không hoạt động bình thường trong Win 6/7/8). Đôi khi tôi viết hoặc được yêu cầu viết một ứng dụng tiện ích để làm một cái gì đó nhanh và/hoặc một lần mà tôi biên dịch như một exe duy nhất.Tôi đã bị bệnh gửi một chương trình đơn giản bằng văn bản chỉ sử dụng lib std cho người khác chỉ cho họ nói với tôi rằng nó không hoạt động vì một số thiếu dll hoặc tái phân phối gói.
Trong thuộc tính dự án của bạn, C/C++, Thư viện thời gian chạy bộ mã thế hệ cho/MT cho bản phát hành bản phát hành của bạn.
(Tín dụng cho Mike Danes người đã trả lời câu hỏi này trên social.msdn: https://social.msdn.microsoft.com/Forums/vstudio/en-US/09afd4be-7a15-4772-98c1-a0464a96cd7f/how-to-static-linkage-in-visual-c-express-edition-2010?forum=vcgeneral&prof=required)
- 1. Sự khác nhau giữa gói phần mềm redistributable c visual visual và gói thời gian chạy là gì?
- 2. Oracle sqlldr TRAILING NULLCOLS được yêu cầu, nhưng tại sao?
- 3. Tại sao C# yêu cầu parens xung quanh điều kiện?
- 4. Gói yêu cầu NTP
- 5. Yêu cầu CORS - tại sao cookie không được gửi?
- 6. Tại sao DefaultOverloadAttribute được yêu cầu trong WinRT?
- 7. Tại sao yêu cầu copy_to/from_user?
- 8. Tại sao clang/llvm trên windows yêu cầu Visual Studio của Link.exe?
- 9. Tại sao lớp MailDefinition yêu cầu System.Web.UI.Control?
- 10. Tại sao yêu cầu một véc tơ?
- 11. Tại sao PreparedStatement.setNull yêu cầu sqlType?
- 12. Bố cục lớp trong C++: Tại sao các thành viên đôi khi được yêu cầu?
- 13. Tại sao một diễn viên được yêu cầu cho phép trừ byte trong C#?
- 14. Tại sao HttpListener bỏ qua các yêu cầu bên ngoài?
- 15. Tại sao môi trường của tôi yêu cầu tôi chạy gói exec?
- 16. Biểu tượng toàn cầu yêu cầu tên gói rõ ràng
- 17. Tại sao Android yêu cầu tên gói phải có ít nhất hai số nhận dạng?
- 18. Tại sao Try-Catch yêu cầu dấu ngoặc nhọn
- 19. Perl yêu cầu tên gói rõ ràng
- 20. Gói VC + Redistributable nào để chọn (x86 hoặc x64)?
- 21. Tại sao #define không yêu cầu dấu chấm phẩy?
- 22. Bao gồm C++ làm yêu cầu trước, nhưng nói "Đã có phiên bản mới"
- 23. Tại sao Http yêu cầu với Fiddler là nhanh chóng
- 24. Lỗi: Phiên bản mới hơn của Microsoft Visual C++ 2010 Redistributable đã được phát hiện trên máy
- 25. Tại sao yêu cầu trong ns hình thức cư xử khác với yêu cầu chức năng
- 26. Ruby yêu cầu 'tệp' không hoạt động nhưng yêu cầu './file' thực hiện. Tại sao?
- 27. Tại sao các tổ chức ẩn danh toàn cầu được yêu cầu phải được khai báo là tĩnh?
- 28. Tại sao Enumerator.new yêu cầu đối tượng "yielder"?
- 29. Tại sao hàm count() yêu cầu tham số?
- 30. Tại sao String [] arg yêu cầu trong Java?
mã biên dịch là * luôn * nền tảng phụ thuộc. Nó hoạt động trên, và chỉ trên, nền tảng nó được biên dịch. –
Không bắt buộc. Bạn nên tạo một dự án thiết lập để thay thế. Hoặc biên dịch với/MT thay vì/MD để bạn không cần nó chút nào. Rủi ro tuy nhiên khi bạn sử dụng DLL. –