나는 리눅스 라이브러리와 관련하여 토론에 참여했으며, 몇 가지 사항을 확인하고 싶습니다.
응용 프로그램을 작성할 때 라이브러리를 사용하는 두 가지 방법이 있다는 것이 내 이해 (잘못되면 수정하고 나중에 게시물을 편집 할 것입니다)입니다.
- 정적 라이브러리 (.a 파일) : 링크 타임에 전체 라이브러리의 복사본이 최종 응용 프로그램에 저장되므로 라이브러리 내의 함수를 항상 호출 응용 프로그램에서 사용할 수 있습니다
- 공유 객체 (.so 파일) : 링크 타임에 해당 헤더 (.h) 파일을 통해 API에 대해 객체를 확인합니다. 라이브러리는 실제로 필요할 때까지 런타임까지 사용되지 않습니다.
정적 라이브러리의 명백한 장점은 전체 응용 프로그램을 자체적으로 포함 할 수 있고 동적 라이브러리의 이점은 ".so"파일을 대체 할 수 있다는 것입니다 (예 : 보안으로 인해 업데이트해야하는 경우) 기본 응용 프로그램을 다시 컴파일하지 않아도됩니다.
공유 객체와 DLL (동적 연결 라이브러리)이 ".so"파일 인 경우에도 일부 사람들이 구별한다고 들었습니다. Linux 또는 다른 POSIX 호환 OS (예 : MINIX, UNIX, QNX 등)에서 C / C ++ 개발에있어 공유 객체와 DLL 사이에 차이점이 있습니까? 지금까지 한 가지 중요한 차이점은 공유 객체가 런타임에 방금 사용되는 반면 DLL은 응용 프로그램 내에서 dlopen () 호출을 사용하여 먼저 열어야한다는 것입니다.
마지막으로, 일부 개발자는 "공유 아카이브"를 언급하는 것을 들었습니다.이 라이브러리는 이해하기에는 정적 라이브러리이지만 응용 프로그램에서 직접 사용하지는 않습니다. 대신, 다른 정적 라이브러리는 "공유 아카이브"에 링크되어 공유 아카이브에서 일부 (전부는 아님) 기능 / 자원을 빌드중인 정적 라이브러리로 가져옵니다.
도움을 주셔서 감사합니다.
최신 정보
이 용어가 제게 제공된 상황에서, Linux를 배워야하는 Windows 개발자 팀이 사용하는 용어는 사실상 잘못된 용어였습니다. 나는 그들을 고치려고했지만 (잘못된) 언어 규범이 고착되었습니다.
- 공유 객체 : 프로그램이 시작될 때 프로그램에 자동으로 연결되고 독립형 파일로 존재하는 라이브러리입니다. 라이브러리는 컴파일 타임에 링크 목록에 포함됩니다 (예 :
LDOPTS+=-lmylib
라는 라이브러리 파일의 경우mylib.so
). 라이브러리는 컴파일 타임과 응용 프로그램이 시작될 때 있어야합니다. - 정적 라이브러리 : 응용 프로그램 코드와 프로그램을 빌드 할 때 프로그램에 자동으로 링크되는 라이브러리 코드 및 둘 다를 포함하는 최종 바이너리를 포함하는 단일 (큰) 응용 프로그램의 빌드 시간에 실제 프로그램 자체에 병합되는 라이브러리 기본 프로그램과 라이브러리 자체는 단일 독립 실행 형 이진 파일로 존재합니다. 라이브러리는 컴파일 타임에 링크 목록에 포함됩니다 (예 :
LDOPTS+=-lmylib
mylib.a라는 라이브러리 파일의 경우). 라이브러리는 컴파일 타임에 존재해야합니다. - DLL : 기본적으로 공유 객체와 동일하지만 컴파일 타임에 링크 목록에 포함되지 않고 라이브러리는
dlopen()
/dlsym()
명령을 통해로드 되므로 프로그램을 컴파일하기 위해 빌드시 라이브러리가 없어도됩니다. 또한 라이브러리는 응용 프로그램을 시작하거나 컴파일 할 때 (필요하게) 존재할 필요가 없습니다 . 왜냐하면dlopen
/dlsym
호출이 수행 되는 순간에만 필요하기 때문입니다 . - 공유 아카이브 : 기본적으로 정적 라이브러리와 동일하지만 "내보내기 공유"및 "-fPIC"플래그로 컴파일됩니다. 라이브러리는 컴파일 타임에 링크 목록에 포함됩니다 (예 :
LDOPTS+=-lmylibS
라는 라이브러리 파일의 경우mylibS.a
). 둘 사이의 차이점은 공유 객체 또는 DLL이 공유 아카이브를 자체 코드에 정적으로 링크하고 공유 객체의 기능을 다른 프로그램에서 사용할 수있게하려면이 추가 플래그가 필요하다는 것입니다. DLL 내부. 이것은 누군가가 정적 라이브러리를 제공하고이를 SO로 다시 패키지하려는 경우에 유용합니다. 라이브러리는 컴파일 타임에 존재해야합니다.
추가 업데이트
" DLL
"와 " shared library
" 의 구분은 위에서 언급 한 설명을 준수하면서 당시 내가 일했던 회사 (Windows 개발자는 Linux 개발로 옮겨 가야하고 용어는 멈춤)에서 (게으르고, 부정확 한) 구어체 일뿐입니다.
또한 S
"공유 아카이브"의 경우 라이브러리 이름 다음에 나오는 " "리터럴은 해당 업계에서 일반적으로 사용되는 것이 아니라 해당 회사에서 사용 된 규칙 일뿐입니다.
.a
파일의는 "a"는 실제로 "archove"을 의미하고, 단순히 오브젝트 파일의 아카이브입니다. 최신 링커는 while 라이브러리를 포함 할 필요가없고 아카이브에 필요한 객체 파일 만 포함 할뿐만 아니라 참조되는 객체 파일의 코드 / 데이터 섹션 만 사용할 수도 있습니다.