Sự khác biệt giữa tệp tiêu đề và thư viện là gì?


80

Một trong những điều tôi đang gặp khó khăn trong việc hiểu cách thức hoạt động của trình biên dịch. Tôi đang gặp rất nhiều khó khăn với nó, nhưng đặc biệt là tôi liên tục nhận được các tiêu đề và thư viện lẫn lộn. Nếu ai đó có thể làm sáng tỏ mọi thứ một chút, điều đó thật tuyệt.


1
C và C ++ là các ngôn ngữ lập trình khác nhau. Và cả hai đều thông số kỹ thuật -không phần mềm - bằng văn bản (chủ yếu là tiếng Anh) trong một số tiêu chuẩn, như n1570 cho C và n3337 cho C ++
Basile Starynkevitch

Câu trả lời:


126

Hãy nghĩ về cả hai điều này như thế này (Tuyên bố từ chối trách nhiệm: đây là một sự tương tự cấp cao thực sự;) ..

  • Các tiêu đề là một số điện thoại bạn có thể gọi điện thoại, thời gian ...
  • ... thư viện là con người thực tế mà bạn có thể tiếp cận ở đó!

Đó là sự khác biệt cơ bản giữa "giao diện" và "triển khai"; các giao diện (tiêu đề) nói với bạn như thế nào để gọi một số chức năng (mà không biết làm thế nào nó hoạt động), trong khi thực hiện (thư viện) là các chức năng thực tế.

Lưu ý: Khái niệm này rất cơ bản, vì nó cho phép bạn linh hoạt: bạn có thể có cùng một tiêu đề cho các thư viện khác nhau (nghĩa là chức năng được gọi chính xác theo cùng một cách) và mỗi thư viện có thể triển khai chức năng theo một cách khác nhau. Bằng cách giữ nguyên giao diện, bạn có thể thay thế các thư viện mà không cần thay đổi mã của mình .

Và: bạn có thể thay đổi việc triển khai thư viện mà không cần vi phạm mã gọi!


2
Ơ ... Tôi vẫn chưa hiểu gì ở đây. Đầu tiên, tôi thậm chí không hoàn toàn chắc chắn về cách các thư viện được tạo ra, tất cả các chương trình tôi đã biên dịch dường như không cần chúng - chúng chỉ không được tạo ra. Tôi giả sử các thư viện cần được xác định? Nhưng bỏ qua điều đó, (các) tệp nguồn chính sẽ phát huy tác dụng ở đâu? Tôi nghĩ rằng các tiêu đề là để triển khai, và các tệp nguồn chính dành cho giao diện - các thư viện chỉ cần thiết để biên dịch tệp thực thi ... Dù sao thì nếu chúng là tĩnh.
Xonara

2
Thư viện được LẬP TRÌNH: Bạn có thể viết chương trình hoặc viết thư viện.
TomTom

2
Nếu tôi nhận thư viện từ người khác. Ví dụ Util.libCách tôi gọi nó là hàm? Tôi có cần bao gồm tệp tiêu đề của nó cũng liên quan đến U til.libkhông?
Elshan

Đối với tiêu đề , tôi hiểu ý bạn nhưng về việc triển khai, tôi vẫn còn bối rối. Bởi vì, nói chung, (các) tệp nguồn chứa phần triển khai đúng không? Nếu chúng ta đã có (các) tệp nguồn thì tại sao chúng ta lại cần thư viện ? Cảm ơn trước!
Milan

57

Một tập tin header được thường sử dụng để xác định một giao diện hoặc bộ giao diện trong một ứng dụng. Hãy coi tệp tiêu đề như một thứ thể hiện chức năng bên ngoài của chương trình trong khi bỏ qua các chi tiết triển khai kỹ thuật.

Ví dụ: nếu bạn đang tối ưu hóa một chương trình, rất có thể bạn sẽ sửa đổi tệp nguồn (.cpp) để cải thiện thuật toán, nhưng tệp tiêu đề sẽ không thay đổi, bởi vì các ứng dụng khách bên ngoài vẫn gọi các phương thức bằng cách sử dụng cùng một bộ thông số và trả về giá trị.

Trong một ngôn ngữ hướng đối tượng như C ++, tệp tiêu đề thường bao gồm những điều sau:

  • Mô tả lớp và phân cấp kế thừa
  • Các thành viên và loại dữ liệu lớp
  • Phương thức lớp

Mặc dù không có gì ngăn cản mã được triển khai trong tệp tiêu đề, nhưng điều này thường không được ưa chuộng vì nó có thể tạo ra các khớp nối và phụ thuộc bổ sung trong mã.

Trong một số trường hợp (ví dụ như các lớp được tạo khuôn mẫu), việc triển khai phải được xác định trong tệp tiêu đề vì lý do kỹ thuật.


Một thư viện là một bộ sưu tập của mã mà bạn muốn cung cấp cho một chương trình hay một nhóm các chương trình. Nó bao gồm việc triển khai một giao diện cụ thể hoặc một tập hợp các giao diện.

Mã được xác định trong một thư viện để ngăn chặn sự trùng lặp mã và khuyến khích sử dụng lại. Thư viện có thể được liên kết tĩnh (.lib) hoặc liên kết động (.dll):

  • Một tĩnh liên kết thư viện định nghĩa một tập các biểu tượng xuất khẩu (có thể được coi là định nghĩa method) mà sau đó được liên kết vào thực thi cuối cùng (.exe) trong giai đoạn nối của quá trình xây dựng. Nó có lợi thế là thời gian thực thi nhanh hơn (vì thư viện không cần phải được tải động), với chi phí là một tệp nhị phân lớn hơn (vì các phương thức về cơ bản được sao chép trong tệp thực thi).

  • Một động liên kết thư viện được liên kết trong việc thực hiện một chương trình, chứ không phải là liên kết của một chương trình. Nó hữu ích khi nhiều chương trình cần sử dụng lại các phương thức giống nhau và được sử dụng rộng rãi trong các công nghệ như COM.


10

Một điều có thể khiến bạn bối rối là thư viện từ có thể có nhiều nghĩa trong C ++. Một ý nghĩa đã được thảo luận ở đây:

Một tập hợp các hàm có thể liên kết trong một tệp nhị phân. Chúng có thể được liên kết tĩnh hoặc liên kết động.

Nhưng có một loại thư viện khác: cái gọi là thư viện chỉ dành cho tiêu đề (bao gồm các phần của STL, TR1 và Boost). Chúng không tồn tại ở dạng nhị phân riêng biệt nên thư viện từ không tham chiếu đến một tệp nhị phân cụ thể mà là một tập hợp các tệp tiêu đề được bao gồm.

Hi vọng điêu nay co ich.


8

Thư viện là mã, được biên dịch thành một tập hợp các tệp đối tượng. Các tệp đối tượng chứa mã máy đã biên dịch và các khai báo dữ liệu được sử dụng bởi mã.

Tệp tiêu đề xác định giao diện của thư viện: nó cho bạn biết cách sử dụng thư viện một cách chính xác. Trong C / C ++, tệp tiêu đề cung cấp cho bạn danh sách tên hàm và cách gọi các hàm đó: số lượng và kiểu tham số mà chúng nhận, kiểu trả về, quy ước gọi, v.v. Tệp tiêu đề có rất nhiều thứ khác trong chúng cũng vậy, nhưng cuối cùng, những gì nó tóm tắt lại là một tập hợp các quy tắc để gọi mã thư viện.


8

Header chỉ chứa phần khai báo, trong khi các thư viện cũng chứa phần triển khai.


2

Nếu Thư viện trong ngôn ngữ lập trình là một thư viện tổng hợp, thì nhiều sách hiện có trong thư viện có thể được so sánh với các hàm / phương thức trong ngôn ngữ. Và các tệp tiêu đề cũng có thể được so sánh với số hàng của sách Giả sử có một cuốn sách trong một thư viện nào đó ở Hyderabad và trong thư viện đó, cuốn sách đó có mặt ở hàng Số 24 ... Cũng giống như cách đưa ra địa chỉ của thư viện bằng cách sử dụng không gian tên std (cho thư viện tiêu chuẩn) và hàng Không được đưa ra bởi tệp tiêu đề nơi tất cả các sách (phương thức trong trường hợp này) cùng một lúc (tất cả các phương thức liên quan đến luồng đầu vào / đầu ra) được đưa lên


2

Header thường được sử dụng để chứa các nguyên mẫu. Tiêu đề mở rộng tại thời điểm xử lý trước để tại thời điểm biên dịch, mã có thể có quyền truy cập vào các khai báo / nguyên mẫu chức năng có liên quan.

Thư viện là phần mềm thực tế có chứa các định nghĩa của các nguyên mẫu chức năng (có trong phần đầu). Thư viện được sử dụng tại thời điểm liên kết. Các định nghĩa (có trong thư viện) được giải quyết tại thời điểm liên kết.


1

Tệp tiêu đề mô tả cách gọi chức năng , một thư viện chứa mã đã biên dịch thực hiện chức năng này.


1

HEADER FILE là tệp khai báo hàm được viết trong đó bằng cách sử dụng tệp tiêu đề, chúng ta có thể truy cập vào một hàm cụ thể

trong khi

TẬP TIN THƯ VIỆN là định nghĩa của một hàm cụ thể được viết. MATH.H là một tệp HEADER trong khi MATH.LIB là tệp thư viện.


1

Làm việc của HEADER File và LIBRARY trong một chương trình.

Một tập tin tiêu đề chứa các liên kết đến các thư viện (thư viện chứa các chức năng và phương pháp chuẩn), một trình biên dịch nhận các chức năng tiêu chuẩn được sử dụng trong mã nguồn thông qua một tiền xử lý, mà giải quyết tất cả các chỉ thị (chỉ là những dòng trong chương trình trước bởi # dấu hiệu cho thấy bao gồm ) trước khi biên dịch thực sự của chương trình.

Cảm ơn vì đã đọc!


1

Tôi nghĩ rằng thư viện như một gói mã được sử dụng lại nhiều lần và mã đó được biên dịch trước, do đó nó có sẵn ở dạng chuẩn để chúng ta không phải viết mã đó cho mọi chương trình mà chúng ta phát triển. Và tệp tiêu đề chứa tham chiếu đến mã đó theo cách đơn giản, các hàm chúng tôi sử dụng trong chương trình của mình như "cin" và "cout" được xác định đầy đủ trong thư viện chuẩn và tệp tiêu đề như tệp tiêu đề iostream chứa tham chiếu đến mã đó. Vì vậy, khi chúng tôi biên dịch mã của mình, chúng tôi chỉ nhận được biên dịch trước cho cin và cout, và chúng tôi không phải viết mã cho cin và cout cho mỗi lần chúng tôi sử dụng nó. Hay nói một cách đơn giản hơn, chúng ta có thể nói rằng một thư viện chứa các mã cho tất cả các chức năng và một tệp tiêu đề là cách để đạt được mã đó.


1

Thư viện là một tập hợp các đối tượng giống nhau để sử dụng không thường xuyên. Nó thường chứa các chương trình ở dạng đối tượng hoặc mã nguồn, mẫu, v.v.

Tệp tiêu đề là vị trí (giao diện) của thư viện


0

Để diễn giải một trò đùa cổ điển, sự khác biệt là thư viện có tệp tiêu đề trong khi tệp tiêu đề không có thư viện.


0

Các thư viện giống như những xác ướp đã chết, được quấn trong những sợi chỉ dài màu trắng. Họ đã chết. Cách duy nhất để giải phóng chúng là thông qua các tệp tiêu đề. Tệp tiêu đề chứa các cách để làm cho chúng trở nên sống động và chúng có thể được thực hiện nhiều lần (sử dụng lại mã).


2
Phép loại suy này hơi ... quá trừu tượng.
byxor

0

Bạn có thể xem xét ví dụ này để understand- Math.hlà một tập tin header bao gồm các nguyên mẫu cho các cuộc gọi chức năng như sqrt(), pow()vv, trong khi đó libm.lib, libmmd.lib, libmmd.dlllà một số trong các thư viện toán học. Nói một cách đơn giản, tệp tiêu đề giống như một thẻ truy cập và các thư viện giống như một người thực, vì vậy chúng tôi sử dụng thẻ truy cập (Tệp tiêu đề) để tiếp cận người thực (Thư viện).


-4

Mã từ các thư viện sẽ chỉ được lưu trữ khi cần thiết cho tệp tiêu đề. Toàn bộ tệp tiêu đề sẽ được lưu trữ, giúp tiết kiệm diện tích lưu trữ của bộ xử lý.


Chào mừng bạn đến với StackOverflow và cảm ơn bạn đã cố gắng trợ giúp. Tuy nhiên, câu trả lời của bạn có thể hữu ích nếu bạn diễn đạt lại nó cho rõ ràng và dễ đọc. Sử dụng một số đánh dấu để định dạng có thể hữu ích. Sự khác biệt giữa tiêu đề và thư viện có những khía cạnh khác, quan trọng hơn là lượng chúng được lưu trữ.
Yunnosch
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.