[완료] 라이브러리 개념좀 알려주세요(*.a, *.so, *.lib, *.dll)

pogusm의 이미지

*.a : 리눅스용, 정적 라이브러리
*.so : 리눅스용, dll 같은 동적 라이브리
*.lib : 윈도용, 정적 라이브러리
*.dll : 윈도용, 동적 라이브러리
라고 알고 있습니다.

또, 해당 라이브러리를 사용하기위한 헤더파일(*.h)이 필요하더라구요.

저는 win7(64bit) + qt4.7(QtCreator) 환경이고
얼마전 openssl 라이브러리를 어렵게 설치했었는데,
작동은 잘 하는데, 아직 이해를 못하는 부분이 많습니다.

openssl 의 소스코드를 다운로드 받아서 어찌어찌 빌드를 하여 아래의 파일들을 얻어서 각각 적절한 위치에 복사해두고 사용중입니다
*.h (복사위치 : C:\Qt\4.7.3\include\openssl)
libeay32.dll, libssl32.dll (복사위치 : C:\Qt\4.7.3\bin\)
libcrypto.a , libeay32.a , libssl.a , libssl32.a (복사위치 : C:\Qt\4.7.3\lib\)

질문1. 윈도우7 환경임에도 *.a 라는 정적 라이브러리가 생성된건 mingw32 용으로 빌드 되었기때문에 생성된 건가요?

질문2. 위와같은 환경에서 test.pro 파일에 LIBS += -lcrypto -leay32 -lssl -lssl32 라고 한다음
main.cpp 에서
#include
이렇게 include해서 컴파일하면, *.dll을 이용하게되는건가요? 아니면 *.a을 이용해서 정적빌드가 되는건가요?

질문3. 제 생각엔 *.a을 이용해서 정적 빌드가 되는거 같은데.. 그렇다면 *.dll 파일은 삭제해도 상관없는것인가요?

조언 부탁드립니다.
굽신굽신

chadr의 이미지

답1 : 네. 확장자가 거슬리시면 VS에서 사용하는 .lib로 바꾸셔도 무방합니다.

답2 : 윈도우의 경우에 .lib(.a)가 정적라이브러리와 동적라이브러리와 구분이 없습니다. 만약 생성된 .lib(.a)가 정적라이브러리라면 정적으로 링크 될 것이고 동적라이브러리를 명시적 링크하기 위해 필요한 심볼이 들어있는 .lib이라면 윈도우의 실행파일 로더는 해당 dll을 메모리상에 로드 할 것입니다.

따라서 정적으로 링크 하시고 싶으시면 정확히 정적 라이브러리의 경로를 명시 해주셔야하고 또한 동적으로 링크 하시고 싶으시면 정확히 동적 라이브러리를 명시적으로 링크할 .lib의 경로를 명시해야합니다.

일반적으로 .lib 파일이 .dll 파일보다 용량이 크다면 해당 .lib는 정적라이브러리일 가능성이 높으며 그 반대는 동적라이브러리를 명시적으로 링크하기 위한 파일일 가능성이 높습니다.

헤더파일을 include하고 안하고에 따라서 라이브러리 링크가 정적인지 동적인지 결정하는것이 아닙니다. 헤더파일 include는 동적이든 정적이든 다 하셔야합니다. 헤더를 사용한다는 것은.. 링커가 최종 실행파일을 생성하기 위해서는 모든 함수들의 심볼이 필요합니다. 즉, 헤더파일은 컴파일러가 링커가 정상적으로 링크를 할 수 있도록 심볼을 생성하는데 사용됩니다. 헤더를 포함하지 않으면 컴파일에러가 날뿐만 아니라 우연하게 컴파일이 성공해도 링크 단계에서 에러가 납니다.

답3 : 답2에서 말씀드린대로 실제 정적라이브러리인지 아닌지 정확히 아셔야합니다. 만약에 정적라이브러리가 아닌상태에서 dll을 지우시면 프로그램 실행 초기에 에러가 날겁니다.

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

pogusm의 이미지

정말 큰 도움이 되었습니다.

그럼, openssl에서 만들어진 파일들을 보면
libssl32.a (176KB) (동적라이브러리) / libssl32.dll (413KB)
libeay32.a (2.48MB) (정적라이브러리) / libeay32.dll (1.94MB)
libssl.a (449KB) (정적라이브러리)
libcrypto.a (2.52MB) (정적라이브러리)

위처럼 이해하면 되는건가요?

그리고 하나 더 궁금한게 있습니다.

libeay32.a 은 정적라이브러리인거 같은데도 libeay32.dll 파일이 존재하는 이유는 무엇인가요?

libeay32.a 은 정적라이브러리가 맞지만, 동적라이브러리로도 사용할 수 있기때문에 그럴때를 위해 libeay32.dll 파일도 제공하는건가요?

감사합니다.

chadr의 이미지

libeay32.a 은 정적라이브러리가 맞지만, 동적라이브러리로도 사용할 수 있기때문에 그럴때를 위해 libeay32.dll 파일도 제공하는건가요?

-> 그럴수도 있습니다. 윈도우의 경우에는 확장자로는 구별법이 없으므로 내용을 열어보거나 링크해서 실행해보기전에는 모릅니다.
정적라이브러리와 동적라이브러리를 배포하는건 배포자 마음이기 때문에 라이센스에 따라서 둘다 배포하는 경우도 있고 하나만
배포하는 경우도 있습니다. 그때그때 다릅니다.

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

익명 사용자의 이미지

.a와 .lib간의 변환은 확장자만 바꾼다고 되지 않고 변환작업이 필요합니다.
사용하고자 하는 컴파일러에 맞게 바꿔줄 수 있으면 바꿔주면 되고 안되면 못합니다.

동적라이브러리도 링킹중에 사용될
(동적라이브러리로 실행중에 링킹될 것이라는 정보를 가지고 있는) 정적라이브러리가 필요합니다.

pogusm의 이미지

즉, 프로그래밍을 할때,

xxxx.a 라는 파일이 정적라이브러리라면 이 파일 하나만 있어도 되지만

zzzz.dll 이라는 파일을 동적라이브러리로 이용하는 프로그램을 만들땐,
반드시 zzzz.a 라는 파일이 필요한거군요.

zzzz.a라는 파일은 위엣분 말씀처럼 "정적라이브러리" 일수도 있고 (정보만 가지고있는)"동적라이브러리" 일수도 있는거구요.

감사합니다.

neogeo의 이미지

반드시 필요하진 않습니다.

dlload 등의 동적 라이브러리를 불러와서 함수 포인터를 얻는 방법도 있습니다.

Neogeo - Future is Now.

chadr의 이미지

mingw을 이용해서 컴파일 하는 경우에는 둘다 똑같습니다. 별도의 변환 작업이 따로 필요하지는 않습니다.
궁금하시면 mingw을 이용해서 라이브러리를 만드시고 VS에서 링크해보세요.

많은 오픈소스 라이브러리에서(예를들어 FFMpeg) 이런 방법을 이용해서 VS에서 사용하라고 하고 있으며 실제로
저도 그렇게 잘 사용하고 있습니다.

http://ffmpeg.org/general.html#TOC20

Then select "Linker / Input" from the tree view, and add the files `libavformat.a', `libavcodec.a', `libavutil.a', `libmingwex.a', `libgcc.a', and any other libraries you used (i.e. `libz.a') to the end of "Additional Dependencies".

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

익명 사용자의 이미지

mingw가 vc와 호환성을 염두에 두고 만들었다면
C의 경우 .a에서 .lib로 특별히 바꾸지 않아도 될만큼 간단하겠지만..
C++이라면 어떨지요?

chadr의 이미지

질문자님 글에서부터 C 기반으로 이야기를 했기 때문에 C언어라는 것을 말 안했군요.

말씀하신데로 C++에서는 심볼 이름이 복잡하므로 컴파일러간 호환이 어렵습니다.

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

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.