2012-01-03 34 views
7

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?

+2

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. –

+1

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. –

Trả lời

6

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).

+2

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. –

+0

@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

+1

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. –

5

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.

1

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.

0

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.

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