2013-03-08 43 views
17

Tôi đã tạo một ứng dụng máy khách trong C++ bằng Visual Studio.vấn đề với chạy tập tin exe được xây dựng với Visual Studio trên một máy tính khác

Bây giờ tôi muốn chạy file exe client trên máy tính khác (mà chưa cài đặt Visual Studio) nhưng khi tôi cố gắng chạy file exe nó mang lại cho các thông báo lỗi sau:

Ứng dụng này đã không khởi động được vì cấu hình của ứng dụng không chính xác. Cài đặt lại ứng dụng có thể khắc phục sự cố này .

Làm cách nào để chạy tệp exe mà không cần cài đặt bất kỳ thứ gì trên máy tính?

+3

Liệu các máy tính có đúng phiên bản của thư viện thời gian chạy C. Nó là rất phổ biến các msvcrtXX.dll inlcude nơi XX là phiên bản không. trong một gói cài đặt. –

Trả lời

4

tôi triển khai chương trình của tôi trong phiên bản thay vì gỡ lỗi và các exe hiện đang làm việc trên máy tính khác

2

Có vẻ như bạn thiếu một số tệp DLL. Hãy chắc chắn để sao chép dll thích hợp cùng với exe.

+1

Có vẻ như anh ta thiếu DLL thời gian chạy VC++. Anh hỏi làm thế nào anh có thể gửi một exe mà không có họ và vì vậy câu trả lời của bạn không giúp đỡ. – Caesar

+0

Câu trả lời sẽ giúp ích nếu thiếu phụ thuộc không phải là C++ redistributable. Bạn có nhận ra rằng các lập trình viên có thể sử dụng tất cả các loại dll, không chỉ các loại dll, đúng không? –

+0

@caesar no, anh ta không nói gửi một .exe mà không có chúng, anh ta nói mà không cần cài đặt * bất cứ thứ gì, vì vậy câu trả lời này là tốt. – JBentley

4

Tôi chưa từng thấy lỗi cụ thể đó trước đây, thường là một lỗi xung quanh một tệp DLL bị thiếu (cửa sổ redistributable). Giả sử không có sự cố với cấu hình, bạn có hai lựa chọn:

1) Thay đổi chế độ biên dịch từ Đa luồng DLL thành Multithreaded. Điều này có thể được thực hiện từ phần C++ của thuộc tính dự án trong quá trình tạo mã. Trong chế độ đa luồng, nhị phân của bạn sẽ được liên kết tĩnh với các cửa sổ redistributable. Đây có lẽ là những gì bạn muốn.

2) Cài đặt các cửa sổ có thể phân phối lại trên máy mục tiêu. Điều này có lẽ không phải là ok b/c bạn nói rằng bạn không muốn cài đặt bất cứ điều gì trên máy mục tiêu.

Cảnh báo về tùy chọn 1, các phiên bản cửa sổ khác nhau có các phiên bản khác nhau của phân phối lại. Có thể gặp phải một môi trường chuyên môn cao trong đó một chương trình liên kết tĩnh sẽ không hoạt động như mong đợi.

+0

Có nhiều hơn hai tùy chọn. Xem câu trả lời của Nayana. – JBentley

18

Các ứng dụng được xây dựng với Visual Studio phụ thuộc vào Visual C++ Redistibutable (VCRedist). Khi chương trình được liên kết động, sau đó các tệp nhị phân của bạn sẽ cần MSVCR**.dll (Thư viện thời gian chạy Microsoft C).

On MSDN, có một bài viết tốt đẹp gọi là Redistributing Visual C++ Files (for Visual Studio 2008), mà khẳng định rằng có tiềm năng lỗi thời gian chạy trong trường hợp đó cần Visual C thư viện ++ không được cài đặt:

bạn có thể nhận một trong các thông báo lỗi sau tùy thuộc vào phiên bản Windows mà bạn cố gắng chạy ứng dụng của mình:

  • Ứng dụng không thể khởi tạo đúng (0xc0000135).
  • Ứng dụng này không khởi động được vì cấu hình ứng dụng không chính xác. Cài đặt lại ứng dụng có thể khắc phục sự cố này.
  • Hệ thống không thể thực thi chương trình được chỉ định.
Về cơ bản bạn có hai lựa chọn:
  • Giải pháp đơn giản nhất là thay đổi liên kết động của các thư viện runtime để liên kết tĩnh. Chuyển đến thuộc tính dự án và dưới C/C++> Tạo mã bạn sẽ tìm thấy tùy chọn Thư viện thời gian chạy. Bạn cần thay đổi từ Multi-threaded DLL (/MD) thành Multi-threaded (/MT).
  • Một giải pháp khả thi khác là đảm bảo rằng phiên bản Microsoft VC++ Redistributable Package phù hợp được cài đặt trên máy đích.

Nhưng ứng dụng của bạn có thể phụ thuộc vào các tệp DLL khác. Trong trường hợp bạn muốn tìm hiểu sự phụ thuộc của chương trình của bạn là gì, có một tiện ích tuyệt vời gọi là Dependency Walker, mà sẽ giúp bạn trong việc này và nhiều tình huống khác :)

+3

+1 để đề xuất liên kết tĩnh. Đó là câu trả lời thực sự cho câu hỏi của OP (làm thế nào để chạy mà không cần cài đặt bất cứ điều gì). 'depends' là một công cụ tuyệt vời để tìm ra thư viện nào bị thiếu. –

+0

Điểm bullet thứ hai của bạn không hỗ trợ OP vì cô ấy là một ràng buộc mà cô ấy không thể cài đặt bất cứ thứ gì trên máy mục tiêu. Ngoài ra còn có nhiều hơn hai giải pháp - xem câu trả lời của Nayana. – JBentley

+0

xin lỗi nhưng tôi không thể thay đổi từ DLL. và tôi cũng đang cố chạy tệp exe mà không cần cài đặt gì đó trên máy tính khác – Karen123456

10

Bối cảnh:

  • C++ Các ứng dụng Cần các assembly thời gian chạy (DLL) để chạy trong bất kỳ máy tính windows nào.
  • Thông thường các hội đồng thời gian chạy này nằm tại thư mục C: \ Windows \ Winsxs.
  • Tất cả các hệ điều hành windows theo mặc định đi kèm với một số cụm thời gian chạy.
  • Nhưng nếu ứng dụng của bạn phát triển trong phiên bản mới hơn của môi trường lắp ráp thời gian chạy, máy tính mục tiêu cũng cần có cùng một phiên bản thời gian chạy tồn tại ở đó.
  • Khi bạn cài đặt studio trực quan, hầu hết các phiên bản mới nhất của các hội đồng thời gian chạy đến máy tính của bạn.

soloution: Cuối cùng bất cứ giá nào nhắm vào máy tính nên có các hội thời gian chạy chính xác. Có rất ít cách để làm điều này (để biết thêm chi tiết tìm kiếm trong google từng).

  1. Liên kết thời gian chạy liên kết tĩnh với ứng dụng của bạn (Troublesome cho ứng dụng lớn).
  2. Cài đặt môi trường phân phối lại C++ trong máy tính đích (cách dễ dàng nhất).
  3. Tạo dự án thiết lập để triển khai thời gian chạy trong máy tính đích khi cài đặt ứng dụng. (Không xấu)
  4. Triển khai hội thời gian chạy như private assemblies (chuyên nghiệp) thấy here để biết thêm chi tiết

Điều kiện:

  • Bạn không phải sử dụng .NET framework trong ứng dụng của bạn.
  • Bạn không phải sử dụng ngôn ngữ chung hỗ trợ thời gian chạy cho các ứng dụng của bạn
+0

Không bao giờ hoặc mới hơn? – BBagi

+0

@RuralJuror. Cảm ơn bạn. Tôi sửa nó –

+0

Theo ý kiến ​​của tôi, đây phải là câu trả lời được chấp nhận, bởi vì nó là người duy nhất đề cập đến tùy chọn hội đồng tư nhân. Một số câu trả lời khác là sai, bởi vì họ nói rằng chỉ có hai lựa chọn (và một trong các tùy chọn đó là vô dụng đối với OP vì cô ấy có ràng buộc không cài đặt bất cứ thứ gì trên máy đích). – JBentley