정적 라이브러리
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
정적 라이브러리는 실행 파일에 링크되어 애플리케이션이 필요한 모든 라이브러리를 포함하는 방식이다. 정적 라이브러리는 의존성 문제를 피하고 배포와 설치를 간단하게 만들 수 있다. 정적 링킹은 실행 파일 크기를 증가시키지만, 라이브러리 파일이 애플리케이션의 일부로 취급될 경우 전체 크기는 비슷하거나 작아질 수 있다. 마이크로소프트 윈도우에서는 응용 프로그램과 함께 라이브러리 파일을 포함하는 것이 일반적이며, 유닉스 계열 시스템에서는 패키지 관리 시스템을 통해 관리한다. 정적 라이브러리 함수는 다른 정적 라이브러리의 함수를 호출할 수 있으며, 링커와 로더는 이를 처리한다. C/C++에서 정적 라이브러리는 외부 연결로 명시된 함수와 변수를 사용하여 생성되며, 파일 이름은 운영체제에 따라 ".a" 또는 ".lib" 확장자를 갖는다. 동적 링크와 비교하여 정적 링크는 장단점이 상반된다.
더 읽어볼만한 페이지
- 라이브러리 - 바이너리 재컴파일러
- 라이브러리 - 동적 링크 라이브러리
동적 링크 라이브러리(DLL)는 윈도우 운영체제에서 프로그램 실행 시 필요한 코드와 데이터를 제공하며, 여러 프로그램에서 공유되어 메모리 효율성을 높이고 모듈성을 향상시키는 라이브러리 형식이다. - 컴퓨터에 관한 - 고속 패킷 접속
고속 패킷 접속(HSPA)은 3세대 이동통신(3G)의 데이터 전송 속도를 높이는 기술 집합체로, 고속 하향/상향 패킷 접속(HSDPA/HSUPA)을 통해 속도를 개선하고 다중 안테나, 고차 변조, 다중 주파수 대역 활용 등의 기술로 진화했으나, LTE 및 5G 기술 발전으로 현재는 상용 서비스가 중단되었다. - 컴퓨터에 관한 - 데이터베이스
데이터베이스는 여러 사용자가 공유하고 사용하는 정보의 집합으로, 데이터베이스 관리 시스템을 통해 접근하며, 검색 및 갱신 효율을 높이기 위해 고도로 구조화되어 있고, 관계형, NoSQL, NewSQL 등 다양한 모델로 발전해왔다.
정적 라이브러리 | |
---|---|
일반 정보 | |
유형 | 프로그램 |
파일 확장자 | .a, .lib |
MIME 유형 | application/octet-stream |
세부 정보 | |
설명 | 정적 라이브러리는 재컴파일 없이 실행 파일에 직접 포함되는 재사용 가능한 루틴의 아카이브입니다. 이것은 각 프로그램이 필요한 루틴의 자체 복사본을 갖는 것을 의미합니다. |
장점 | 프로그램 배포의 단순성 라이브러리 종속성의 부재 |
단점 | 더 큰 실행 파일 크기 라이브러리 업데이트를 활용하기 위해 프로그램 재컴파일 필요 |
사용 예시 | |
C/C++ | .a (유닉스 계열 시스템) .lib (마이크로소프트 윈도우) |
오브젝티브-C | .a |
델파이 | .lib |
파스칼 | .a |
스위프트 | .a |
2. 장점과 단점
정적 라이브러리를 동적으로 링크하는 방식에 비해 사용할 때의 장점은 애플리케이션이 필요로 하는 모든 라이브러리가 존재하고, 올바른 버전임을 확신할 수 있다는 것이다. 이는 DLL 지옥 또는 의존성 지옥으로 알려진 문제를 방지한다. 또한 정적 링킹을 사용하면 애플리케이션을 단일 실행 파일에 포함할 수 있어 배포 및 설치가 간편해진다.
정적 링킹을 하면 대상 실행 파일(또는 라이브러리)에서 직간접적으로 참조하는 라이브러리 부분만 포함하면 되지만, 동적 라이브러리의 경우 애플리케이션에서 어떤 함수가 호출될지 미리 알 수 없으므로 전체 라이브러리가 로드된다는 단점이 있다.
정적 링킹에서는 라이브러리 코드가 실행 파일 내에 저장되기 때문에, 실행 파일의 크기가 동적 링킹 때보다 커진다. 그러나 라이브러리 파일이 애플리케이션의 일부로 간주되면 총 크기는 비슷하거나 컴파일러가 사용하지 않는 코드를 제거하는 경우 더 작아질 수도 있다.
동적 링크는 프로그램 코드의 실체를 공유 라이브러리 또는 동적 링크 라이브러리(DLL)에 분할해 두고, 프로그램 실행 시작 시 로더에 의해 결합하는 방식이며, 동적 링크의 장점과 단점은 정적 링크의 반대이다.
2. 1. 환경별 특징
마이크로소프트 윈도우에서는 애플리케이션에 필요한 라이브러리 파일들을 포함하는 것이 일반적이다.[6] 유닉스 계열 시스템에서는 패키지 관리 시스템을 사용하여 사용 가능한 정확한 라이브러리 파일들을 보장하기 때문에 윈도우보다는 덜 흔한 일이다. 이것은 라이브러리 파일들이 많은 애플리케이션들 사이에서 공유될 수 있게 하며, 공간을 절약한다. 또한 라이브러리를 사용하는 애플리케이션을 업데이트하지 않고도, 라이브러리만을 업데이트함으로써 버그와 보안 결함을 고칠 수 있게 한다. 실제로 많은 실행 파일들(특히 윈도우용)이 정적 라이브러리와 동적 라이브러리를 모두 사용한다.[1]3. 링킹과 로딩
어떤 정적 라이브러리 함수도 다른 정적 라이브러리의 함수나 프로시저를 호출할 수 있다. 링커와 로더는 다른 목적 파일들과 같이 이것을 같은 방식으로 처리한다. 정적 라이브러리 파일들은 런타임에 링킹 로더 (예: X11 모듈 로더)에 의해 링크될 수 있다. 그러나 이러한 과정을 정적 링킹으로 부를 수 있는지에 관해서는 논란이 있다.
4. C/C++에서 정적 라이브러리 생성
C나 C++에서 정적 라이브러리를 쉽게 만들 수 있다. 이 두 언어는 외부 또는 내부 링크를 나타내고, 다른 특징들을 제공하기 위해 기억 영역 분류를 제공한다. 이러한 정적 라이브러리를 생성하기 위해서, 익스포트되는 함수/프로시저들과 다른 객체 변수들은 반드시 ''external linkage''로 명시되어야 한다(즉, C에서 `static` 키워드를 사용하지 않음). 정적 라이브러리 파일 이름은 보통 유닉스 계열 시스템에서는 ".a" 확장자를 갖고[7] 마이크로소프트 윈도우에서는 ".lib" 확장자를 갖는다.
예를 들어, 유닉스 계열 시스템에서 `class1.o`, `class2.o`, `class3.o` 파일을 사용하여 `libclass.a`라는 아카이브를 만들려면 다음 명령을 사용한다.[8]
```
ar rcs libclass.a class1.o class2.o class3.o
```
`class1.o`, `class2.o`, `class3.o`에 의존하는 프로그램을 컴파일하려면 다음과 같이 할 수 있다.
```
cc main.c libclass.a
```
또는 (`libclass.a`가 `/usr/local/lib`와 같은 표준 라이브러리 경로에 있는 경우)
```
cc main.c -lclass
```
또는 (링크하는 동안)
```
ld ... main.o -lclass ...
```
대신:
```
cc main.c class1.o class2.o class3.o
5. 동적 링크와의 비교
동적 링크는 프로그램 코드의 실체를 분할해 두고, 프로그램 실행 시작 시 로더에 의해 처음으로 결합하는 방식이다. 동적 링크의 장점과 단점은 정적 링크의 반대이다.[6]
정적 링크는 동적으로 링크하는 대신 라이브러리를 실행 파일에 포함시키므로 몇 가지 장점이 있다. 가장 눈에 띄는 점은 애플리케이션이 자신의 모든 라이브러리들이 존재하고 그것이 정확한 버전인 것을 확신할 수 있다는 점이다. 이것은 DLL 지옥 또는 의존성 지옥으로 알려진, 의존성과 관련된 문제들을 피할 수 있게 한다. 또한 정적 링킹은 애플리케이션이 단일 실행 파일에 포함되게 함으로써 배포와 설치를 간단하게 만든다.
정적 링킹에서는 라이브러리 코드가 실행 파일 내에 저장되기 때문에, 실행 파일의 크기는 분리된 파일에 저장하는 동적 링킹 때보다 커진다. 그러나 라이브러리 파일들이 애플리케이션의 부분으로서 세어진다면, 전체 크기는 비슷하거나 컴파일러가 사용되지 않은 심볼들을 제거한 경우에는 더 작아질 수 있다.
마이크로소프트 윈도우에서는 애플리케이션이 필요한 라이브러리 파일들을 포함하는 것이 흔한 일이지만, 유닉스 계열 시스템들에서는 패키지 관리 시스템들이 사용 가능한 정확한 라이브러리 파일들을 보장하기 때문에 덜 흔한 일이다. 이것은 라이브러리 파일들이 많은 애플리케이션들 사이에서 공유될 수 있게 하며 공간을 절약한다. 또한 라이브러리를 사용하는 애플리케이션의 업데이트 대신, 라이브러리만을 업데이트함으로써 버그와 보안 결함을 고칠 수 있게 한다. 실제로 많은 실행 파일들이(특히 윈도우 용) 정적 라이브러리와 동적 라이브러리들을 모두 사용한다.
참조
[1]
웹사이트
The End of DLL Hell
http://msdn.microsof[...]
microsoft.com
2000-01-11
[2]
웹사이트
Static Libraries
http://tldp.org/HOWT[...]
TLDP
2013-10-03
[3]
Microsoft Docs
Create C/C++ DLLs in Visual Studio
https://docs.microso[...]
[4]
Microsoft Learn
Advantages of Dynamic Linking - Win32 apps
https://learn.micros[...]
[5]
웹인용
Static Libraries
http://tldp.org/HOWT[...]
TLDP
2013-10-03
[6]
웹인용
The End of DLL Hell
http://msdn.microsof[...]
microsoft.com
2000-01-11
[7]
웹인용
Static Libraries
http://tldp.org/HOWT[...]
TLDP
2013-10-03
[8]
웹인용
Static Libraries
http://tldp.org/HOWT[...]
TLDP
2013-10-03
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com