2009-07-14 21 views
13

Tôi mới vào C++ và có một số thứ tôi hoàn toàn không nhận được. Trong C#, nếu tôi muốn sử dụng một thư viện bên ngoài, ví dụ như log4net, tôi chỉ thêm một tham chiếu đến DLL log4net và các thành viên của nó sẽ tự động có sẵn cho tôi (và trong IntelliSense). Làm cách nào để làm điều đó trong C++ không được quản lý?Làm thế nào để "thêm tài liệu tham khảo" trong C++

Trả lời

23

Thông thường, thư viện đi kèm với 1) tệp tiêu đề (.h) và 2) tệp .lib bên cạnh .dll.

Tệp tiêu đề đượC# include'ed trong mã của bạn, để cung cấp cho bạn quyền truy cập vào các khai báo kiểu và hàm trong thư viện.

.lib được liên kết với ứng dụng của bạn (thuộc tính dự án -> trình liên kết -> đầu vào, phụ thuộc bổ sung).

Tệp .lib thường chứa các sơ đồ đơn giản tự động tải dll và chuyển tiếp cuộc gọi hàm tới nó.

Nếu bạn không có tệp .lib, bạn sẽ phải sử dụng hàm LoadLibrary để tải động DLL.

+0

Kỹ lưỡng hơn câu trả lời của tôi. Tôi cũng sẽ thêm rằng, nếu bạn đang sử dụng LoadLibrary, sau đó bạn có thể không chỉ đơn giản là gọi chức năng theo tên. Bạn cần phải làm ràng buộc muộn. –

+1

Tôi thấy tôi không còn đầy đủ nữa. LoadLibrary trả về một xử lý, bạn có thể chuyển đến GetProcAddress, cung cấp cho bạn một con trỏ thực. Bạn cũng có thể chọn để gọi FreeLibrary để dỡ bỏ nó. (Tôi đã đi trước và xóa câu trả lời ban đầu của mình.) –

+0

@Steven: Đúng, tôi nghĩ rằng nếu anh ta cần sử dụng LoadLibrary, tôi chỉ cho anh ta một điểm khởi đầu, mà không bị sa lầy trong các chi tiết (nhiều) gritty. – jalf

0

Điều đầu tiên bạn cần làm là để #include tệp tiêu đề mô tả các chức năng có sẵn trong thư viện đó.

Mã thực tế cho thư viện sẽ được ở một trong 2 nơi:

  1. Một thư viện tĩnh (.lib)
  2. Một dll (.dll)

Tùy thuộc vào cách mã thư viện được trao cho bạn (như lib file, hoặc như là một .dll), bạn sẽ phải hoặc là:

  • #pragma comment (lib, "libraryname.lib") nếu một mình lib
  • LoadLibrary nếu nó .dll

Đôi khi một gói đi kèm với cả hai một file .lib mà bạn cần phải liên kết đến, và một file .dll. Trong trường hợp này, bạn không cần phải gọi LoadLibrary, bạn chỉ cần #pragma comment (lib, "libaryfile.lib") vì trong trường hợp này .lib liên kết bạn vào .dll.

Một chi tiết rất quan trọng là đặt DLL nơi ứng dụng của bạn có thể tìm thấy nó. Charles Petzold nói:

Khi Windows cần nạp mô-đun DLL trước khi chạy chương trình yêu cầu, tệp thư viện phải được lưu trữ trong thư mục chứa chương trình .EXE, thư mục hiện tại, thư mục hệ thống Windows, Thư mục Windows, hoặc một thư mục có thể truy cập thông qua chuỗi PATH trong môi trường MS-DOS. (Các thư mục được tìm kiếm theo thứ tự đó.) Programming windows, 5th ed MSDN

tôi không khuyên bạn sử dụng menu thuộc tính dự án liên kết bởi vì nó không phải là có thể nhìn thấy những gì thư viện bạn đang liên kết đến.

See also

+0

Điều này không trả lời được câu hỏi. –

+0

Điều này trả lời câu hỏi ngay bây giờ, nhưng không chính xác. Như jalf chỉ ra, bạn thường liên kết với các lib nhập khẩu (bằng cách sử dụng pragma hoặc nếu không thêm nó vào dòng lệnh lib.exe gió lên với). Sử dụng LoadLibrary là lựa chọn thay thế muộn. –

4

C++ không có thư viện theo ý bạn. Nó có các tệp tiêu đề mà bạn #include và nó có những thứ được gọi là các thư viện mà trình liên kết liên kết với, chứa mã được biên dịch. Bạn cần phải thêm các thư viện (tệp .LIB) vào cài đặt trình liên kết.

Trên Windows nếu bạn đang sử dụng DLL, lý tưởng là bạn nên có tệp .LIB để đi với tệp được gọi là Thư viện nhập cho DLL và bạn thêm tệp .LIB đó vào cài đặt trình liên kết của mình.

9

Khái niệm cơ bản là: Có 2 loại thư viện: tĩnh & động. Sự khác biệt giữa chúng là các thư viện tĩnh trong bước xây dựng liên kết nhúng mã được biên dịch của chúng vào tệp thi hành (hoặc dll) của bạn; libs động chỉ cần nhúng con trỏ vào các hàm và một lệnh mà một số dll sẽ được tải khi programm sẽ nạp. Điều này được thực hiện cho bạn bởi trình liên kết.

Bây giờ bạn có thể quyết định xem bạn sẽ sử dụng cái nào trong số hai thiết bị đó. DLL có nhiều thuận lợi và bất lợi. Nếu phát triển một ứng dụng lớn, nó có thể đáng xem xét việc sử dụng các tệp DLL với tải chậm trễ thay vì các lib tĩnh. Một số libs chỉ đơn giản là giao cho bạn như là DLL và bạn không có sự lựa chọn. Dù sao, cách dễ nhất cho người mới bắt đầu là sử dụng các thư viện tĩnh. Điều đó sẽ làm cho việc triển khai và thử nghiệm của bạn dễ dàng hơn nhiều, vì khi giao dịch với DLL, bạn phải đảm bảo rằng chúng được tìm thấy trong thời gian chạy (ngay cả khi sử dụng trình gỡ rối), điều này liên quan đến việc sao chép mọi thứ trong một thư mục hoặc xử lý các biến đường dẫn.

Thông thường nhà cung cấp DLL (nếu bạn dự định có thể xử lý thư viện) cung cấp cho bạn tệp tiêu đề và .lib chứa các cuộc gọi vào DLL mong muốn. Một số nhà cung cấp (ví dụ: tăng) chỉ yêu cầu bạn bao gồm tệp tiêu đề và thư viện lib được tự động liên kết với tệp thực thi của bạn (có thể đạt được thông qua chỉ thị pragma của trình biên dịch prorietary). Nếu không phải là trường hợp bạn phải đi vào các thiết lập dự án của dự án C++ (dự án thích hợp/Thuộc tính cấu hình/Trình liên kết/Đầu vào) và nhập tên tệp lib vào hàng "Phụ thuộc bổ sung", ví dụ: iced.lib iceutild.lib. Bạn cũng có thể đặt tên đường dẫn đủ điều kiện ở đó. Lưu ý rằng bạn phải nhập tên tệp lib cho cả hai cấu hình (Debug, Release). Đây là thủ tục bạn làm với các thư viện tĩnh và Dll như nhau. Sự khác biệt duy nhất mà DLL sẽ yêu cầu một thư viện DLL được hoặc trong thư mục ứng dụng của bạn hoặc trong một trong các thư mục đường dẫn.

Sau bước đó bạn vẫn có thể gặp lỗi trình biên dịch nếu bạn cố liên kết các thư viện không tương thích. Có nhiều lý do, tại sao chúng có thể không tương thích. Nhưng cố gắng liên kết đầu tiên với lib theo cách này và xem có hoạt động không. Nếu không, hãy đăng lại các lỗi của bạn tại đây;)

Bao gồm (các) tệp được sử dụng để bao gồm ở những nơi mà bạn muốn sử dụng smth. từ thư viện. Chỉ cần bao gồm nó và trình biên dịch sẽ biết rằng các ký hiệu phải đến từ một đơn vị biên dịch khác (biên dịch) (biên dịch cpp-file => tệp đối tượng) hoặc .lib. Nó sẽ làm cho tìm kiếm và thông báo cho bạn nếu các biểu tượng yêu cầu không được tìm thấy.

Good Luck,
Ovanes

T.B. Điều này có thể khó khăn trong đầu, nhưng khi bạn quen với nó, nó sẽ dễ dàng.

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