2012-12-24 21 views
5

Tôi đã đọc hai câu hỏi SO sau: Which runtime libraries to ship?License of runtime libraries included in GCC? - cả hai đều rất hữu ích nhưng không hoàn toàn là những gì tôi đang tìm kiếm.Yêu cầu đối với thư viện thời gian vận chuyển/DLL

Tôi luôn viết các chương trình để sử dụng trên máy của riêng mình, điều này chưa bao giờ gây ra bất kỳ vấn đề gì, nhưng bây giờ tôi muốn bắt đầu chạy phần mềm trên các máy khác và tôi cảnh giác với các yêu cầu thời gian chạy.

EDIT: Xem ví dụ bên dưới để thay thế, điều này gây hiểu lầm.

Cụ thể, nếu tôi viết một chương trình C++ trên một máy Windows, biên dịch với gcc qua MinGW, và muốn chạy nó trên máy khác:

  • Tôi có phải gửi libstdC++. dll với chương trình của tôi?
  • Đây có phải là tệp duy nhất (tôi giả định được đặt trong thư mục của tệp thi hành) đủ để cho phép chương trình chạy không?

Ngoài ra, ví dụ giống hệt, ngoại trừ lần này là chương trình Mục tiêu-C. Đang gửi tệp libobjc.dll đến máy khác đủ để cho phép chương trình thực thi đúng cách?

Tôi đã quen với việc chạy các chương trình trên máy có công cụ nhà phát triển, v.v., nhưng bây giờ tôi đang tìm cách chạy chúng trên các máy mục đích chung (bạn bè, đồng nghiệp ...) và tôi không hoàn toàn chắc chắn phải làm gì!


EDIT: Để đối phó với dinh thự 's câu trả lời, tôi cảm thấy tôi nên làm rõ nó là gì tôi đang tìm kiếm. Tôi biết làm thế nào để xác định các DLL cần thiết (/ dylibs, vv) mà các chương trình của tôi sử dụng, (mặc dù tôi đã quen với việc thực hiện công việc đó một cách thủ công; Tôi chưa từng nghe về bất kỳ công cụ nào). Câu hỏi của tôi là "Tôi phải làm gì bây giờ?"

Một ví dụ tổng quát hơn có lẽ là cần thiết:

Hãy nói rằng tôi đã viết một chương trình trong đó có đối tượng file có nguồn gốc từ C++, C và/hoặc Objective-C (2) mã. Tôi đã sử dụng một số mã Windows API được biên dịch thành công bằng cách sử dụng gcc của MinGW. Tôi cũng có một DLL tùy chỉnh tôi đã viết trong Visual Studio (C + +).

Tôi đã xác định chương trình của tôi sẽ sử dụng khi chạy (một trong số đó có thể là libobjc.dll của GCC, tôi không chắc liệu điều này có nên tạo sự khác biệt trên máy Windows hay không, nhưng tôi muốn thực hiện điều này càng chung càng tốt) - "các điều kiện tiên quyết DLL".

Tôi muốn chạy nó trên máy tính đồng nghiệp của tôi, hầu hết trong số đó chạy Windows 7, nhưng một số hiện nay chạy Windows 8. Bắt đầu từ khi bắt đầu vì lợi ích của sự hoàn chỉnh:

  • Tôi có cần thế nào để chuyển các tệp điều kiện tiên quyết DLL vào máy tính của đồng nghiệp của tôi?
  • Tôi nên đặt chúng vào thư mục nào? (thư mục exe/thư mục hệ thống?)
  • Khi nào tại chỗ, sự hiện diện của các tệp DLL này có cho phép chương trình thực thi chính xác không? (Giả sử nó biết nơi để tìm chúng)
  • Có bất kỳ tệp nào khác cần được chuyển với các tệp DLL không?

Về cơ bản, tôi đang cố xác định toàn bộ quá trình suy nghĩ để phát triển và chạy một ứng dụng trên máy khác theo yêu cầu thời gian chạy hệ thống.

Trả lời

4

Khi tải tệp DLL, vị trí đầu tiên Windows trông là thư mục mà exe đang ở. Vì vậy, có thể nó sẽ hoạt động tốt để đặt các tệp DLL ở đó.

Đối với các DLL Microsoft mặc dù, tôi nghĩ rằng nó có ý nghĩa hơn để yêu cầu đồng nghiệp của bạn để cài đặt thời gian chạy Visual C++, đó là một gói redistributable từ Microsoft. Lý tưởng nhất là bạn sẽ làm cho một trình cài đặt bằng cách sử dụng một cái gì đó như WiX và nó sẽ cài đặt điều kiện tiên quyết đó cho bạn, nhưng nó là OK để chỉ cho đồng nghiệp của bạn để làm điều đó.

Hãy chắc chắn bao gồm tệp giấy phép với phần mềm của bạn nếu bạn bao gồm DLL từ gcc, vì GPL yêu cầu nó.

+1

Đối với các ứng dụng cửa hàng win8 thấy điều này .. http://blogs.msdn.com/b/vcblog/archive/2012/09/28/10354327.aspx –

3

libstdC++ không nhất thiết phải đủ. Bạn gần như chắc chắn cần libgcc quá, nhưng phụ thuộc thực tế có thể thay đổi với ứng dụng cụ thể của bạn.

Cách tốt nhất cách tốt nhất để xác định những gì bạn cần gửi cùng với ứng dụng của bạn là tải EXE của bạn vào chương trình như Dependency Walker.

Cũng giống như một ví dụ, tôi đã biên soạn một chương trình thử nghiệm C++ đơn giản chỉ in một chuỗi :: std. As you can see, nó phụ thuộc trực tiếp vào hai mô-đun khác với các mô-đun đi kèm với Windows; libgcc_s_dw2-1.dll ngoài libstdc++-6.dll.

Bạn nên nhớ mở rộng cây theo từng DLL để đảm bảo rằng chính nó không có bất kỳ phụ thuộc nào khác (nếu A phụ thuộc vào B, B có thể phụ thuộc vào C ngay cả khi A không trực tiếp phụ thuộc vào C) .

Nếu bạn lo lắng và muốn đảm bảo mạnh nhất, bạn có thể cài đặt Windows vào máy ảo (VirtualBox miễn phí) và kiểm tra ứng dụng của bạn bên trong nó. Nếu bạn sử dụng các API của Microsoft, bạn có thể kiểm tra tài liệu MSDN để xem phiên bản Windows nào đã được giới thiệu và đảm bảo rằng nó phù hợp với phiên bản Windows tối thiểu đích của bạn.

Cập nhật: Như xtofl points out này sẽ không bao gồm các thư viện tự động nạp sử dụng LoadLibrary. Nếu bạn muốn trang trải cơ sở này, hãy sử dụng Process Monitor để kiểm tra những tệp DLL nào được chạm vào khi bạn chạy ứng dụng. (Thêm tiêu chí 'Image Path' với đường dẫn đến EXE của bạn để không bị tràn ngập.) Điều này có thêm lợi thế là nó bao gồm tất cả các tệp, mục đăng ký, v.v. mà ứng dụng của bạn phụ thuộc vào, không chỉ các tệp DLL.

+0

'depends' sẽ sinh ra các tệp nhị phân được tải tĩnh. Các tệp được tải với ví dụ 'LoadLibrary (...)' sẽ bị bỏ qua, nhưng đây là sự kiểm soát của bạn anyway – xtofl

+1

Cách tốt nhất là không sử dụng phụ thuộc. Cách tốt nhất là hiểu phụ thuộc ứng dụng của bạn từ đầu. Đọc tài liệu biên dịch là cần thiết. –

+0

Bạn cũng có thể chạy ứng dụng của bạn từ bên trong Dependency Walker (Profile-> Start Profiling). Sau đó, nó sẽ cập nhật chế độ xem với các thư viện đó thực sự được tải khi chạy. –

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