2009-10-17 30 views
9

Sau khi viết một ứng dụng CGI trong Visual Studio 2008 và gỡ lỗi cục bộ, tôi đã tải nó lên hệ điều hành Windows Server 2003 nơi nó không chạy kịp thời.Chạy các tệp nhị phân C++ mà không có thời gian chạy redistributable (Server2k3, XPSP3)

Tôi đoán tôi cần phải cài đặt Runtime chia tồi tệ, nhưng sau khi đọc bài viết này:

http://kobyk.wordpress.com/2007/07/20/dynamically-linking-with-msvcrtdll-using-visual-c-2005/

tôi tự hỏi nếu nó làm cho ý nghĩa hơn để bỏ qua bên này bên cạnh các công cụ và chỉ re-write ứng dụng.

Tôi đoán Windows Server 2003 không có phiên bản MSCRVT tôi cần? Windows Server 2003 có không?

Khi nói đến việc triển khai khách hàng dày, tôi muốn phân phối các tệp dll yêu cầu với ứng dụng của tôi. Họ giả sử tôi chỉ BAO GỒM iostream, sstream, string?

Có thay đổi đáng kể nếu tôi thêm cửa sổ.h không?

Added:

Sử dụng công tắc/MT đề nghị dưới đây

C/C++ -> Mã Generation -> Runtime Library -> Multi-ren (/ MT)

(Bạn có thể sẽ cần để làm sạch:

Build -> sạch

để tránh các thông báo lỗi

"Không thể lưu tệp kê khai được cập nhật vào tệp")

cồng kềnh ứng dụng của tôi từ 38k đến 573k. Đó là những gì tôi gọi là đáng kể (hãy tưởng tượng nếu đó là tiền lương của bạn). Kể từ khi nhiều trường hợp của ứng dụng này sẽ được tải và dỡ liên tục (yêu cầu bộ nhớ quý giá và tài nguyên bộ vi xử lý) tôi muốn tìm một giải pháp tốt hơn (nhỏ hơn).

Tôi hiểu điều này không quan trọng đối với nhiều tình huống hiện nay và không phải là trọng tâm của nhiều nhà phát triển, do đó xu hướng là .NOT và 60MB runtimes, nhưng đây là những gì tôi muốn làm.

Added:

Sau khi loại bỏ các gỡ lỗi để có được dự án để biên dịch:

Project -> propeties -> c/C++ -> Preprocessor -> Preprocessor định nghĩa (loại bỏ DEBUG;)

kích thước đã giảm xuống còn 300k, và nó sẽ chạy.

Added: Theo đề nghị của Chris Becke bên dưới, sao chép: msvcm90.dll msvcp90.dll MSVCR90.DLL Microsoft.VC90.CRT.manifest Để thư mục của ứng dụng sẽ cung cấp tất cả các thời gian chạy cần thiết.

Sử dụng Visual Studio 6 đã được đề xuất vài lần nhưng không hỗ trợ Vista (hoặc Windows 7 mà chúng tôi giả định) Các giải pháp khác không yêu cầu phân phối thời gian chạy có thể là MASM hoặc thậm chí là hương vị Cơ bản.Thật không may là đánh bại mục đích của việc sử dụng một ngôn ngữ OOP cấp cao như C++.

Vì vậy, miễn là tôi cần yêu cầu C++ redistributable được cài đặt, giao dịch tắt là 260k bổ sung. Thats chấp nhận

+0

* Thay đổi * có ý nghĩa gì không? Khá nhiều, gần như bất cứ điều gì bạn xây dựng với VS2008 sẽ yêu cầu cài đặt thời gian chạy là tốt. – Joe

+0

Bạn sẽ cần thời gian chạy gần như không có vấn đề gì. Lựa chọn của bạn là * cách * bạn bao gồm nó. Phương pháp thuận tiện nhất là sử dụng phiên bản được liên kết tĩnh. Sau đó, bạn không phải phân phối một dll riêng biệt cả. Nếu không, bạn có nửa triệu cách để phân phối dll. Khác với điều siêu phức tạp đòi hỏi phải đọc 15 trang tài liệu, chỉ cần đặt nó vào một thư mục có tên chính xác trong thư mục gốc của ứng dụng, điều này khá dễ quản lý. – jalf

+0

Tôi không chắc chắn làm thế nào có hiệu quả này sẽ được, nhưng hãy thử fiddling xung quanh với các tùy chọn trình biên dịch/linker. Có một số ít ảnh hưởng đến kích thước thực thi (một cái gì đó về việc tối ưu hóa kích thước và loại bỏ những thứ không sử dụng). –

Trả lời

6

Một danh sách đầy đủ hơn về lựa chọn:

  • Viết lại các ứng dụng để theres không có C/C++ sử dụng ở tất cả.
  • Chuyển sang Visual Studio 6 hoặc bộ công cụ dựa trên mingw như Code :: Blocks - chúng sử dụng msvcrt.dll đã được phân phối làm thời gian chạy của chúng.
  • Tạo bằng cách sử dụng nút chuyển/MT. Điều này xây dựng các chức năng thời gian chạy cần thiết vào exe của bạn. Mà sẽ sưng lên nó. Nhưng mà bloat (thẳng thắn) là ít chi phí hơn tải dll riêng biệt.
  • Phân phối thời gian chạy VS9 dưới dạng cài đặt 'sx riêng'. Điều này đòi hỏi phải sao chép nội dung của C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT vào cùng thư mục với exe của ứng dụng của bạn. Nếu bạn đã áp dụng SP1, thì thư mục này sẽ chứa thời gian chạy SP1, nhưng ứng dụng của bạn sẽ yêu cầu thời gian chạy RTM (xem hình). Thêm _BIND_TO_CURRENT_CRT_VERSION vào các dự án của bạn định nghĩa, xây dựng lại và điều đó sẽ tự sắp xếp.
  • Có vẻ như một vc_redist.exe có thể thu được cho VS9. Tìm điều đó hoặc tìm ra trình cài đặt của MSI hoặc mojo cần thiết để cài đặt phần lắp ráp bên trên (là nội dung của Microsoft.VC90.CRT) vào kho lưu trữ sx được chia sẻ.
+0

Phân phối thời gian chạy VS9 hoạt động. Xem Thảo luận ở trên –

9

Hãy để tôi sửa lại câu trả lời của tôi:

Bạn có một vài lựa chọn:

1) Cài đặt VC++ 2008 runtime. Bạn có thể download và trình cài đặt cho chúng. Kết hợp các mô-đun cho họ cũng có sẵn.

2) Liên kết với thời gian chạy tĩnh (/ MT hoặc C/C++ -> Tạo mã -> Thư viện thời gian chạy: Đa luồng). Điều này sẽ làm tăng kích thước của tệp thực thi của bạn, nhưng nó sẽ không phụ thuộc vào bất kỳ Dll nào. Nếu bạn lo lắng về kích thước, chỉ sử dụng thư viện chuẩn C hoặc chỉ sử dụng API Windows trực tiếp.

3) Sử dụng phiên bản VC++ cũ hơn. 2005 và trước đó không yêu cầu thời gian chạy được cài đặt. Các Dll có thể được đặt trong cùng thư mục với tệp thực thi. Nếu bạn sử dụng VC++ 6.0 thời gian chạy sẽ được cài đặt trên tất cả các phiên bản của cửa sổ, nếu không bạn cần phải tự cài đặt.

+0

Tôi nghĩ rằng bạn có nghĩa là Thuộc tính dự án -> C/C++ -> Cod Generation -> Thư viện RUntime -> Đa luồng (/ MT) –

+0

Bộ mã hóa hoặc Cod? Haha .. bạn có lẽ đúng, tôi đã cố gắng để làm điều đó từ bộ nhớ. –

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