인프런 커뮤니티 질문&답변

김민수님의 프로필 이미지
김민수

작성한 질문수

홍정모의 따라하며 배우는 C언어

16.12 라이브러리

라이브러리 구조의 대한 질문

해결된 질문

작성

·

72

·

수정됨

2

라이브러리에 대하여 궁금한 점이 있습니다.

main함수가 있는 파일 : A

라이브러리 파일 : B

A파일에서 B라이브러리에 있는 함수들을 사용해서 실행파일로 만들경우 컴파일러(링커)에서 A파일에 정의되어 있지도 않는 함수들을 사용했기 때문에 오류가 발생할 수 있지만 여기선 두가지 길이 있다는 걸 확인 했습니다.

첫번째 : 헤더파일을 만들어서 거기에 함수의 선언과 정의를 몰아적기 그리고 해당 헤더파일을 include 하기

첫번째 방법대로 했을 경우 라이브러리 파일을 따로 만들지 않아도 된다.

1.png

 

두번째 : 헤더파일엔 함수의 선언(프로토타입)부분만 적어놓고 몸체(정의)부분은 .c파일로 만들어서 라이브러리 파일로 만들기

두번째 방법의 경우 vs(IDE)의 기능 덕분인지 다양한 방법들이 있다.

2.pngimage.png

이 경우에는 include를 따로 하지 않아도 알아서 실행이 되더라구요. 같은 프로젝트에 있으니까 vs(IDE)가 알아서 지원 해주는 것 이겠죠?

또 다른 방법으로는

3.png

프로젝트를 분류하여 lib파일을 만든 다음 lib파일을 전혀 다른 폴더 위치에 옮긴 다음 진행해봤습니다.

4.png

main함수가 있는 프로젝트 옵션에서 사용하려는 lib를 등록만 했는데 include를 따로 하지 않아도 작동되는 걸 확인할 수 있었습니다.

이처럼 따로 include를 하지 않고 다른 프로젝트에서 라이브러리를 만들고 그 라이브러리를 링커에 등록만 해주면 사용할 수 있는 구조가 맞는 구조인건가요? 어차피 링커는 함수의 몸체(정의)부분만 찾으면 되는 거니까요?

그렇다면 굳이 헤더파일과 라이브러리 파일을 분류하여 둘 다 만드는 이유는 라이브러리 파일만 쓰자니 라이브러리 파일에 어떤 함수가 있고 어떤 것들이 있는지는 .c파일을 열어보기 전까지 확인할 수 없고.

헤더파일만 쓰자니 함수의 선언과 몸체부분을 한 곳에 다 몰아적으면 함수가 많아질 경우 직관적으로 보기가 힘들어서 사용하기 불편하기 때문이고

이걸 남들이 사용할 수 있도록 배포 했을 경우 라이브러리 파일만 배포했을 경우 사람들이 해당 라이브러리엔 어떤 함수들이 있는지 보지 못하기 때문에 헤더파일엔 어떤 함수들이 있는지 선언(프로토타입)부분만 보여주며 입력값은 무엇이고 리턴값은 무엇인지 알려주고 그 함수들이 어떻게 정의(몸체)가 되었는지 보여주고 싶지 않기 때문에(비밀) lib파일과 .h파일 둘 다 만들어서 배포하는 건가요?

답변 2

1

안녕하세요? 질문&답변 도우미 Soobak 입니다.

 

네, 정확하게 잘 이해하고 계십니다.

우선, 먼저 지금까지의 강의에서 링킹 과정, 헤더 파일, 함수의 선언과 정의, 라이브러리 각각에 대한 개념 학습으로 결론을 잘 유추해내신 점이 참 인상깊네요.
꼼꼼히 학습하신 것이 느껴져서 저에게도 좋은 자극이 되어주시는 것 같습니다.
감사합니다.

 

헤더파일(.h)과 라이브러리 파일(.lib 또는 .a)을 함꼐 사용하는 이유에 대해서 조금 추가 설명을 드려보면 다음과 같습니다.

  • 인터페이스와 구현의 분리, 사용 편의성 등
    : 말씀하신 내용처럼, 헤더파일에는 함수의 선언(프로토타입), 사용 방법, 매개변수, 반환 타입 등 인터페이스 정보를 제공하고 라이브러리 파일에는 실제 함수의 구현(정의)을 포함하도록 분리함으로써, 사용자가 함수의 내부 구현을 알 필요 없이 인터페이스만으로 쉽게 라이브러리를 사용할 수 있습니다.


  • 보안, 정보 은닉
    : 또한, 핵심적인 알고리듬이나 비즈니스 로직(이미 배경지식이 있으실 수도 있지만, 개발과 관련되어 자주 사용되는 중요한 용어 중 하나입니다. 만약, 낯설으시다면 키워드 검색으로 간단히 개념을 접해보시는 것을 추천드립니다. 질문 해주신 강의가 문법 강의이기 때문에 굳이 언급 드려봅니다.)을 라이브러리 파일에 숨겨 사용자에게 헤더 파일을 통해서는 필요한 정보만 제공하고, 소스 코드는 공개하지 않을 수 있습니다.

  • 버전 관리와 호환성, 모듈화 및 재사용성 등
    : 간단히 설명드려보면, 헤더 파일의 인터페이스를 유지하면서 라이브러리의 내부 구현을 변경할 수 있습니다. 따라서, 호환성을 유지하면서 성능 개선이나 버그 수정 등도 가능하게 됩니다.

추가적으로, 중간에 언급해주신 명시적 include 없이 라이브러리 사용이 가능한 이유에 대해서도, 말씀해주신 것 처럼 VisualStudio 의 기능이 맞습니다. 같은 프로젝트 내에서는 VisualStudio 가 자동으로 파일을 연결해주므로, 명시적으로 include 를 하지 않고 사용할 수 있습니다.

0

안녕하세요, 인프런 AI 인턴입니다. 김민수님.

라이브러리 함수와 헤더 파일의 동작 방식에 대한 질문을 해주셨군요. 관련 내용에 대해 자세히 설명된 기존 질문&답변을 추천해드리고자 합니다.

먼저, 라이브러리 함수와 사용자 지정 함수의 차이를 문의하신 것과 관련된 질문입니다:
- 질문: 사용자 지정함수와 라이브러리 함수의 차이

다음으로, 링크 및 컴파일 과정에서의 헤더 파일과 소스 파일의 역할에 대해 설명된 질문입니다:
- 질문: main.c에는 새로 지정한 함수의 프로토타입만 있는 헤더파일만이 include된 것인데 어떻게 정상 실행되나요?

위 링크들에서 답변을 확인하시면, 라이브러리 파일, 헤더 파일, 그리고 컴파일러와 링커의 역할에 대한 설명이 자세히 나와있습니다.

요약하자면, 헤더 파일은 일반적으로 함수의 프로토타입과 상수, 데이터 타입 정의 등을 포함하며, 실질적인 함수 정의는 라이브러리 파일(.lib) 또는 객체 파일(.obj)에 포함됩니다. 컴파일 단계에서 헤더 파일의 정보는 컴파일러가 참고하여 각 소스 파일을 처리하고, 이후 링킹 단계에서 라이브러리 파일에 정의된 함수 코드가 실행 파일에 포함됩니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김민수님의 프로필 이미지
김민수

작성한 질문수

질문하기