2008-12-04 22 views
6

Tôi muốn triển khai một DLL rất đơn giản với ứng dụng C# của tôi, nhưng bất kỳ DLL nào mà tôi xây dựng trong Visual Studio 2008 dường như có một sự phụ thuộc vào "Microsoft.VC90.CRT". Có thể xây dựng một DLL bằng cách sử dụng VS2008 mà không có sự phụ thuộc này? Làm thế nào tôi có thể nói điều gì đang gây ra sự phụ thuộc?Có thể xây dựng một DLL trong C++ không có phụ thuộc không?

Trả lời

12

Tôi không chắc chắn về phiên bản VC++ mới nhất, nhưng trước đây bạn có thể yêu cầu trình liên kết liên kết với phiên bản tĩnh của thư viện thời gian chạy MSVCRT thay vì phiên bản động (DLL). Có thể tùy chọn này vẫn tồn tại.

+0

Đây là một ý tưởng thú vị. Có vẻ như MS khuyên bạn không nên làm điều này, nhưng nếu nó giải quyết được vấn đề của tôi ... –

+0

Điều này làm việc như một người vô địch - cảm ơn. –

+0

Tôi không đồng ý. Bạn có thể chạy vào tất cả các loại vấn đề khi bạn cố gắng liên kết các thư viện tĩnh trong thư viện đó là động. –

1

Cung cấp công cụ này một shot: http://www.dependencywalker.com/. Nó sẽ cho phép bạn đi qua các phụ thuộc của bạn trên một exe hoặc dll đã cho.

+0

Dường như việc tạo một tệp DLL rỗng trong VS2008 cũng có sự phụ thuộc này. Tôi đã không thêm bất kỳ tài liệu tham khảo thêm hoặc bất cứ điều gì, chỉ là một dự án trống rỗng. –

7

Theo this MSDN page, thư viện tĩnh vẫn có sẵn. Chuyển đến thuộc tính dự án, thuộc tính cấu hình, C/C++, Tạo mã, Thư viện thời gian chạy.

Chọn Gỡ lỗi đa luồng cho cấu hình gỡ lỗi và Đa luồng cho cấu hình phát hành. (Không chắc chắn nếu các tên đều giống nhau trong VS2008, nhưng nên là "một nơi nào đó xung quanh có". Có thể cập nhật ngày mai với sự khác biệt cụ thể VS2008)

Ngoài ra, như wbic16 đề xuất, sử dụng phụ thuộc walker để xác định phụ thuộc tĩnh khác.

3

Nếu bạn hoàn toàn chắc chắn bạn không có bất kỳ phụ thuộc nào trong thời gian chạy C, thì bạn có thể tránh liên kết với nó bằng cách bật cờ "Bỏ qua tất cả thư viện mặc định" (/ NODEFAULTLIB) trong dự án Linker -> Input trang tùy chọn. Bạn cũng có thể phải tắt kiểm tra thời gian chạy cơ bản (đặt "Kiểm tra thời gian cơ bản" thành Mặc định trong C/C++ -> Tạo mã) và bạn cũng có thể phải xóa điểm nhập (đặt "Không nhập điểm" thành "Có (/ NOENTRY) "dưới Linker -> Nâng cao).

Xem thêm http://support.microsoft.com/kb/814472, nó có một số thông tin tốt về xây dựng DLL cho Tiện ích mở rộng được quản lý cho C++.

Chỉnh sửa: Lưu ý rằng chạy mà không có thời gian chạy C cũng có nghĩa là bạn không có chức năng phân bổ bộ nhớ dễ dàng như malloc() và mới.

+0

Tôi nghĩ rằng NODEFAULTLIB chỉ nên được sử dụng trong những trường hợp rất hiếm khi bạn có thể đảm bảo rằng thư viện chuẩn không được sử dụng. Nếu không, bạn nên tắt liên kết thời gian chạy là tĩnh. –

1

Với một chút công việc, libCTiny vẫn hoạt động như một sự thay thế cho lib mặc định. Loại thư viện này làm cho/NODEFAULTLIB có thể sử dụng được.

Để trả lời câu hỏi thứ hai của bạn, với trình chuyển đổi liên kết/VERBOSE, trình liên kết sẽ cho bạn biết ký hiệu nào được lấy từ thư viện nào.

0

Đảm bảo xây dựng mọi thứ trong bản phát hành thường xuyên trong gỡ lỗi, dll được liên kết với các dll gỡ lỗi đặc biệt thường không được gửi kèm với cửa sổ và sẽ gây ra sự cố phụ thuộc.

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