[완료]라이브러리와 헤더파일이란?

SilverWhalle의 이미지

라이브러리와 헤더파일.
항상 대충적인 늬앙스만 느끼고 있었습니다.
이젠 확실히 알아야 될것 같습니다.

항상 제 머리속에 있던 생각이 모든 헤더파일들을
분석하고 싶다는 거였습니다.

그런데 어떻게 접근해야 할지를 모르겠습니다.

정확히 라이브러리와 헤더파일은 다른 것인가요?
항상 같은것으로 인식하고 있습니다. 개념이 부족합니다.
그저 헤더파일이 여러개 모이면 라이브러리가 되는건가요?

그 라이브러리와 헤더파일은 어디에 정확히 위치한건가요?
우분투기준입니다. /usr/lib, /lib, /usr/include ..
이 세위치가 전부인가요? 그리고 그 위치에 있는 파일들이
모두 라이브러리나 헤더파일인가요? 엄청많던데요..

c 표준 라이브러리라는 것이 있잖아요. 그리고 c언어에 대한
컴파일러에는 gcc라고 하는것을 우리가 지금 쓰고 있습니다.
그리고 윈도우에는 visual c라고 하는 컴파일러가 있습니다.
사실 visual c가 이름인지는 모르겠습니다. 맞나요?

이런 여러 컴파일러가 존재하더라도 어차피 같은 c 컴파일러이기에
표준 c 라이브러리만 정확히 알고 있으면 어떤 컴파일러든지 사용할수
있는건가요?

그리고 컴파일러와 라이브러리는 별개인가요? 라이브러리는 컴파일러에
따라오는 부수적인 건가요?

chadr의 이미지

1. 라이브러리와 헤더는 엄연히 다릅니다. 라이브러리는 기계어로 번역된 바이너리이며, 헤더는 컴파일러가 컴파일하기전.. 그러니까 프로그래머가 알아먹을 수 있고 c/c++의 문법에 맞게 작성되어있는 선언들의 집합입니다.

라이브러리를 사용하기 위해서는 해당 라이브러리의 헤더파일이 있어야합니다. 그래야지만 링커가 알아먹을수 있는 심볼네임을 컴파일러가 만들어내기 때문입니다.

컴파일러가 이런 헤더파일을 가지고 심볼네임을 만들어서 오브젝트 파일에 넣어주면 링커가 해당 심볼네임을 가지고 라이브러리를 뒤져서 링크를 하게 됩니다.

헤더가 여러개 모이는게 라이브러리가 아닙니다. 라이브러리는 컴파일된 바이너리이므로 소스파일의 컴파일된 산물인 오브젝트(리눅스의 경우에는 .o , 윈도우의 경우에는 .obj)파일을 여러개 모아놓은게 라이브러리입니다.

라이브러리의 확장자는 리눅스의 경우에는 .a, 윈도우의 경우에는 .lib입니다.

2. 제가 리눅스를 많이 안써봐서 말씀하신 위치 이외에 라이브러리와 헤더가 들어가는지는 모르겠습니다. (물론 나열하신 위치 말고도 다른 위치를 컴파일러 옵션으로 지정이 가능합니다.)
다만 나열하신 위치에 들어있는 파일들이 라이브러리와 헤더들입니다..

3. visual c보다는 visual c++이라고 하셔야 맞을거 같습니다.. 물론 6.0, .net 2003 .net 2003, .net2005과 같이 여러버전이 존재합니다.

4. 일반적으로 표준 c라이브러리는 대부분의 c컴파일러가 지원합니다. 표준 함수를 알고 계시면 대부분의 컴파일러에서 동일하게 소스를 바꾸지 않고 컴파일이 가능합니다.

5. 컴파일러와 라이브러리는 별개입니다. 컴파일러를 설치하면 들어있는 표준 c라이브러리도 사실 없어도 프로그램이 컴파일되는데는 문제가 없습니다. 대신 직접 모든걸 다 해줘야하는게 문제입니다. c언어의 시작 함수가 main이지만 실제로는 이 main함수를 호출하기전에 해주는 것이 많습니다. 그런걸 직접 일일이 만들어줘야하는 것이죠..

그리고 라이브러리는 c표준 라이브러리 뿐만 아니라 누구든지 라이브러리로 구성하면 그게 다 라이브러리입니다.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

SilverWhalle의 이미지

라이브러리란것이 바이너리 파일이었군요. 그래서 libc.a를 열어보니
엉망진창이었군요. 1번은 아직 완전히 이해되진 않았지만 어느정도
감이오네요. 그리고 키워드들을 알려주셨으니 알아보겠습니다.
감사합니다.

익명 사용자의 이미지

제가 어려워 하던 부분을 명확하게 설명해 주셨어요
감사합니다 ㅎㅎ

익명 사용자의 이미지

이 분이 뭘 모르고 쓰시는 바람에 다른 게시물보니까
라이브러리는 컴파일 하기전에 동작되는 기계어로 된 바이너리파일이라고 "도배"가 된 것을 보고 눈쌀을 찌푸리게 되어 한자 적습니다
라이브러리는 한국말도 아니고 컴퓨터 용어도 아니고 사전엔 도서관이란 뜻이고
컴퓨터용어로 쓸 경우에는 꼭 라이브러리 확장자로 된 기계어만 이야기 하는거 아닙니다
라이브러리는 소스형식도 있고 오브젝트 형식도 있고 로드형식도 있습니다
통합적으로 이야기하면 "컴퓨터 프로그램에서 자주 사용되는 부분 프로그램들을 모아 놓은 것. 언제든지 자유롭게 이용할 수 있도록 구성되어 있다."
결국은 헤더는 라이브러리안에 속한 부분으로써 다른것은 맞지만 소스파일과 라이브러리로 나누는 것은 옳지 않습니다
이런 정의나 이딴 것은 시간이 지나면 심심하면 봐뀌는 것입니다.
혹시 자신이 잘못된 지식을 가지고 있거나 혹시 제가 틀려도 어디 한군대서 읽고 그게 전부인냥 우기지는 맙시다
이런 정의같은 지식은 심심하면 봐뀔 수 있고 프로그래밍하는데 중요한 것 아닙니다
이런 글 쓰면서도 이런데 시간낭비한 자신이 한심하게 느껴지기도 합니다
그냥 이게 아니니까 다른 게 틀렸다는 것은 오직 수학과 프로그래밍 안에서만 가능한 이야기입니다.
이런 지식은 크게 신경쓰지 말고 남이 하는 말을 이해하고만 넘어가도록 합시다

익명 사용자의 이미지

그러니까 좋은 비유가 하나 떠 올라 적습니다

열쇠: 자물쇠를 여는 쇠붙이 입니다

당신은 어떤 교회에 들어가게 되었습니다 (프로그래밍을 하게 되었습니다)
주님만이 오직 우리의 마지막 열쇠입니다 라고 목사가 설교를 했습니다 (라이브러리는 프로그래밍할때 사용하는 프로그램들을 모아 놓은 것이다)
그런데 어느날 집사님께서 우리의 마지막 열쇠는 성경입니다. (라이브러리는 기계어로된 바이너리 파일입니다)
그러자 여러분은 집사님이 틀렸다고 수도 없이 손가락 질을 합니다 (도배)
거기서 제가 목사님께 한마디 합니다 (열쇠는 자물쇠를 여는 쇠붙이입니다)

이 중에 누가 틀리고 맞고 할 게 어디 있습니까?

우리는 이 짓을 하며 시간 낭비하고 있는 겁니다
원래 열쇠가 교회용어가 아니고 열쇠는 열쇠인 것입니다
이와 같이 프로그래밍에서 라이브러리가 어떤 파일을 가르키게 되긴 했지만
라이브러리는 도서관이란 뜻이 맞구요 프로그래밍 백과사전도 뒤져보면
오브젝트,소스일,로드다 포함하고 있습니다

"집사님 성경이랑 주님이랑 같은건가요?"같은 질문을 하게 된거고
"엄연히 다릅니다"같은 대답을 하고 있는거죠

라이브러리는 그냥 도서관입니다

GunBBang의 이미지

위에 댓글만 보고 하마터면 라이브러리 = 기계어로 되어있는 파일 이란 고정관념에 얽매일뻔했습니다.
익명 사용자로 하셔서 누구신지는 모르겠지만 다시한번 감사드려요

11111의 이미지

잘 읽었어요

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.