Làm cách nào để tạo .exe được liên kết tĩnh hoàn toàn với Visual Studio Express 2005?


109

Môi trường C ++ ưa thích hiện tại của tôi là phiên bản Microsoft Visual Studio 2005 Express miễn phí và phần lớn tuyệt vời. Đôi khi, tôi đã gửi các tệp .exe phát hành cho người khác với kết quả hài lòng. Tuy nhiên, gần đây tôi đã phát hiện ra một điều đáng lo ngại rằng kết quả hài lòng dựa trên nhiều may mắn hơn mà tôi muốn. Cố gắng chạy một trong những chương trình này trên hộp XP cũ (2001, không được cập nhật cẩn thận) không cho tôi kết quả gì ngoài một thông báo khó chịu "Hệ thống không thể chạy x.exe" (hoặc tương tự).

Một số googling tiết lộ rằng với bộ công cụ này, thậm chí chỉ định liên kết tĩnh dẫn đến một hello-world.exe đơn giản thực sự dựa vào các tệp .dll bổ sung (msvcm80.dll, v.v.). Một hệ thống lược đồ phiên bản cực kỳ phức tạp (tệp kê khai có ai không?) Sẽ không cho phép .exe chạy mà không có phiên bản .dll chính xác. Tôi không muốn hoặc không cần những thứ này, tôi chỉ muốn một tệp .exe kiểu cũ tự chứa không làm gì khác ngoài các hoạt động Win32 mẫu số chung thấp nhất và chạy trên bất kỳ hệ điều hành win32 cũ nào.

Có ai biết nếu nó có thể làm những gì tôi muốn làm với bộ công cụ hiện có của tôi?

Cảm ơn bạn.

Câu trả lời:


126

Đối với thời gian chạy C, hãy chuyển đến cài đặt dự án, chọn C / C ++ rồi chọn 'Tạo mã'. Thay đổi cài đặt 'thư viện thời gian chạy' thành 'đa luồng' thay vì 'dll đa luồng'.

Nếu bạn đang sử dụng bất kỳ thư viện nào khác, bạn có thể cần yêu cầu trình liên kết bỏ qua CRT được liên kết động một cách rõ ràng.


"Nếu bạn đang sử dụng bất kỳ thư viện nào khác, bạn có thể cần yêu cầu trình liên kết bỏ qua CRT được liên kết động một cách rõ ràng." Gần đây tôi đã gặp phải vấn đề này. Tôi đang xây dựng một ứng dụng wxWidgets, tôi nhận thấy mình cần phải xây dựng lại các lib wxWidgets với cùng một sửa đổi tạo mã
Bill Forster

6
Người đàn ông 300 ký tự không phải là nhiều. Trong trường hợp nhận xét ở trên không rõ ràng, vấn đề là cả tệp .cpp của bạn và bất kỳ tệp .cpp thư viện nào đều cần phải có 'đa luồng' thay vì 'dll đa luồng' nếu không bạn có thể gặp lỗi liên kết.
Bill Forster

Điều này giới thiệu nhiều vấn đề liên quan đến quản lý heap mà bạn có thể không muốn làm gì.
Edward Strange

Đối với các thư viện CRT, VS cung cấp các tùy chọn / MD & / MT. Tuy nhiên, liên kết tĩnh các thư viện khác nói chung - ví dụ, libX.lib (có thể là thư viện của riêng tôi hoặc thư viện của bên thứ ba)?
Kiran MN

4
Tôi hiểu error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease'. Có nơi nào khác để thay đổi loại công trình không? Tôi đang xây dựng ứng dụng wxWigets, giống như @BillForster. Vì vậy, tôi sẽ phải xây dựng lại wxWidgets? Làm thế nào để làm điều đó?
Tomáš Zato - Phục hồi Monica

18

Kinh nghiệm của tôi trong Visual Studio 2010 là có hai thay đổi cần thiết để không cần DLL. Từ trang thuộc tính dự án (nhấp chuột phải vào tên dự án trong cửa sổ Giải pháp Explorer):

  1. Trong Thuộc tính cấu hình -> Chung, thay đổi trường "Sử dụng MFC" thành "Sử dụng MFC trong Thư viện tĩnh".

  2. Trong Thuộc tính cấu hình -> C / C ++ -> Tạo mã, thay đổi trường "Thư viện thời gian chạy" thành "Đa luồng (/ MT)"

Không chắc tại sao cả hai đều cần thiết. Tôi đã sử dụng điều này để loại bỏ sự phụ thuộc vào glut32.dll.

Được thêm vào sau: Khi thực hiện những thay đổi này đối với cấu hình, bạn nên chuyển chúng thành "Tất cả cấu hình" --- bạn có thể chọn tùy chọn này ở đầu cửa sổ Thuộc tính. Nếu bạn chỉ thực hiện thay đổi đối với cấu hình Gỡ lỗi, thì nó sẽ không áp dụng cho cấu hình Bản phát hành và ngược lại.


1
Điều này dường như hoạt động trong Visual Studio 2013 với một bổ sung nhỏ: Tôi phải thay đổi Thuộc tính cấu hình -> Chung -> Bộ ký tự thành "Sử dụng bộ ký tự Unicode".
gnovice

4

Tôi đã gặp vấn đề phụ thuộc tương tự này và tôi cũng biết rằng bạn có thể bao gồm VS 8.0 DLL (chỉ phát hành! Không gỡ lỗi! --- và chương trình của bạn cũng phải được phát hành) trong một thư mục có tên thích hợp, trong thư mục mẹ có .exe của bạn:

Cách thực hiện: Triển khai bằng XCopy (MSDN)

Cũng lưu ý rằng mọi thứ được đảm bảo sẽ trở nên tồi tệ nếu bạn cần phải có mã C ++ và C trong cùng một tệp .exe được liên kết tĩnh vì bạn sẽ nhận được xung đột trình liên kết chỉ có thể được giải quyết bằng cách bỏ qua libXXX.lib chính xác và sau đó liên kết động (DLL) .

Cuối cùng, với một bộ công cụ khác (VC ++ 6.0), mọi thứ "chỉ hoạt động", vì Windows 2000 trở lên đã được cài đặt đúng các tệp DLL.


1

Liên quan đến phản hồi của Jared, có Windows 2000 trở lên sẽ không nhất thiết phải khắc phục sự cố trong tầm tay. Phản hồi của Rob không hoạt động, tuy nhiên có thể bản sửa lỗi này gây ra các vấn đề bảo mật, vì các bản cập nhật Windows sẽ không thể vá các ứng dụng được xây dựng như vậy.

Trong một bài đăng khác, Nick Guerrera đề xuất đóng gói Visual C ++ Runtime Redistributable với các ứng dụng của bạn, cài đặt nhanh chóng và độc lập với Visual Studio.


2
Trong khi đóng gói tệp có thể phân phối lại dường như là giải pháp ưu tiên, bạn cần quyền quản trị viên để chạy trình cài đặt có thể phân phối lại. Đó không phải là một lựa chọn khả thi nếu bạn có bất kỳ người dùng không phải quản trị viên nào.
Kevin Condon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.