8

Tôi đã dự án C++ không được quản lý trong Visual Studio 2010. Nó sử dụng tăng cường, glut và một thư viện khác từ một nhà cung cấp.Kết nối và triển khai động và tĩnh trong Visual Studio 2010

Tôi đã thiết lập dự án để tạo thêm khả năng thực thi "dll-indepenendent". Tất cả các thư viện boost đều được liên kết tĩnh và không cần dll trong thư mục chứa file thực thi.

Điều tương tự cho Glut, tôi đã liên kết glut32.lib tĩnh thay vì glut32.dll và một lần nữa không có vấn đề gì.

Tôi đã chọn cho thư viện Thời gian chạy phiên bản NON-dll, tức là Gỡ lỗi đa luồng (dành cho cấu hình Debug) và Đa luồng cho cấu hình phát hành.

Bây giờ, nhà cung cấp mà tôi đã nói trước đây, cung cấp hai lựa chọn thay thế là Vendor.lib và Vendor.dll.

Các Vendor.lib được thêm vào trong Linker-> phụ thuộc bổ sung nhưng lúc chạy tôi luôn phải đặt Vendor.dll trong cùng thư mục của tệp thực thi, nếu không môi trường thời gian chạy sẽ phàn nàn vì không tìm thấy Nhà cung cấp thư viện .dll.

Tôi nên giải quyết vấn đề này như thế nào? Tôi muốn tránh để đưa vào mỗi thư mục các tập tin .dll.

Tôi không muốn đặt dll trong cùng một thư mục của exe và nói chung các nguyên tắc để triển khai các ứng dụng giao diện điều khiển C++ không được quản lý trong Visual Studio là gì?

Tôi biết có rất nhiều câu hỏi và các trang về lập luận này nhưng không ai trong số những người làm rõ tôi điểm này.

Một số ý tưởng?

Trả lời

10

Microsoft là một chút buồn cười trong cách nó xử lý này: khi bạn tạo một .dll, bạn cũng tạo một .lib, chứa các biểu tượng công khai trong .dll. Bạn phải liên kết với .lib để tải .dll tại thời gian chạy là , nhưng tệp .lib này vẫn không phải là thư viện tĩnh. Nếu nhà cung cấp của bạn cung cấp phiên bản cho liên kết tĩnh, sẽ không có .dll hoặc hai .lib (có lẽ là trong các thư mục khác nhau hoặc có tên khác nhau). Một ví dụ khác về việc Microsoft phát triển nghiêm trọng hơn khó khăn hơn mức cần thiết.

+2

Đây không phải là MS cụ thể. Linux cũng có thư viện nhập. – rubenvb

+8

Unix có hai loại "thư viện": thư viện (tệp .a) và đối tượng được chia sẻ (tệp .so).Một nhà cung cấp cung cấp một thư viện (theo nghĩa chung) thường sẽ cung cấp cả hai. Nếu bạn liên kết với tệp .a, bạn liên kết tĩnh và nếu bạn liên kết với .so, bạn liên kết động. Vấn đề với giải pháp của Microsoft là 1) bạn có hai tệp riêng biệt cho liên kết động và 2) một trong các tệp có cùng tên với thư viện tĩnh. –

+0

Cảm ơn bạn đã trả lời. Có lẽ tôi không phải là người duy nhất bối rối về chủ đề này. Vì vậy, như bạn đang nói, có hai loại tệp .lib, một tệp được tạo khi thư viện động là cần thiết và một tệp khác có thể là thư viện tĩnh. Tôi không tìm thấy một tập tin Vendor.lib khác, vì vậy tôi đoán tôi đang ở trong trường hợp đầu tiên ... Cảm ơn bạn! – linello

7

Vendor.lib cần phải là thư viện được biên dịch tĩnh. Nếu khi bạn liên kết này, bạn vẫn cần Vendor.dll, có vẻ như Vendor.lib thực sự là một thư viện nhập chứ không phải là một thư viện tĩnh.

Kiểm tra xem nhà cung cấp có cung cấp một Vendor.lib khác (mà phải lớn hơn một chút so với .lib hiện tại của bạn) là thư viện tĩnh và thử liên kết với điều đó. Nếu vậy, bạn sẽ không cần dll.

+0

Rất tiếc, tôi không có các tệp .lib khác trong thư viện đó, vì vậy tôi đoán rằng tôi đang ở trong trường hợp liên kết động. Không có phương pháp nào khác để bao gồm .dll thay vì sao chép nó trong thư mục thực thi (hoặc sao chép chúng vào thư mục System32?) – linello

+0

Nếu bạn có quyền truy cập vào nguồn của nhà cung cấp, bạn có thể biên dịch vendor.lib như một thư viện tĩnh . Nếu không, nếu bạn phải sử dụng lib được chia sẻ, thì exe của bạn cần truy cập vào thời gian chạy này, nghĩa là thêm nó vào thư mục với exe, hoặc đặt nó vào một thư mục có trong% PATH% (quy ước là Thư mục System32). – Fraser