정적 라이브러리 예제

Microsoft Windows에서 응용 프로그램에 필요한 라이브러리 파일을 포함하는 것이 일반적입니다. [2] 유닉스와 같은 시스템에서는 패키지 관리 시스템을 사용하여 올바른 라이브러리 파일을 사용할 수 있도록 할 수 있기 때문에 덜 일반적입니다. 이를 통해 라이브러리 파일을 많은 응용 프로그램 간에 공유하여 공간을 절약할 수 있습니다. 또한 라이브러리를 사용하는 응용 프로그램을 업데이트하지 않고도 버그 및 보안 결함을 수정하도록 라이브러리를 업데이트할 수 있습니다. 실제로 많은 실행(특히 Microsoft Windows를 대상으로 하는 실행)은 정적 라이브러리와 동적 라이브러리를 모두 사용합니다. 이 동적 라이브러리(liball.so)를 사용하려면 my_program.c라고 부를 수 있습니다. 이 프로그램은 동적 라이브러리의 함수를 사용한다고 가정 해 봅시다. 그런 다음 정적 라이브러리를 만든 것과 동일한 방식으로 프로그램을 컴파일해야 합니다. 1. 라이브러리에 함수가 포함된 C 파일을 만듭니다. C 프로그램이 컴파일되면 컴파일러는 개체 코드를 생성합니다. 개체 코드를 생성한 후 컴파일러는 링커도 호출합니다.

링커의 주요 작업 중 하나는 라이브러리 함수 (예 : printf(), scanf(), sqrt()의 코드를 만드는 것입니다. 등) 프로그램에 사용할 수 있습니다. 링커는 라이브러리 함수 코드를 개체 코드에 복사하거나 라이브러리 함수의 전체 코드가 복사되지 않고 런타임에 사용할 수 있도록 몇 가지 방법을 사용하여 이 작업을 수행할 수 있습니다. 정적 라이브러리는 나중에 다른 개체와 결합되어 최종 실행 파일을 형성하는 개체 파일입니다. 컴퓨터 과학에서 정적 라이브러리 또는 정적 연결 라이브러리는 컴파일 타임에 호출자에서 해결되고 컴파일러, 링커 또는 바인더에 의해 대상 응용 프로그램에 복사되어 개체 파일을 생성하는 루틴, 외부 함수 및 변수 집합입니다. 독립 실행 형입니다. [1] 이 실행 및 컴파일 프로세스는 모두 프로그램의 정적 빌드라고 합니다. 역사적으로 라이브러리는 정적일 수 있습니다. 정적 라이브러리는 컴파일 타임에 결정된 정적 메모리 오프셋에서 해당 실행 파일의 주소 공간에 단일 실행 파일을 형성하기 위해 건물/연결하는 동안 다른 정적 라이브러리 및 개체 파일과 병합됩니다.

/link-시간입니다. 이 프로그램은 라이브러리 파일을 찾을 위치를 알아야 합니다. 따라서 동적 라이브러리의 위치를 환경 LD_LIBRARY_PATH에 추가해야 합니다. 다음 명령으로 이 작업을 수행할 수 있습니다. 이제 다음 명령을 사용하여 라이브러리 libheymath.so 빌드합니다. [root@host ~]# gcc -o libheymath.so add.o sub.o 마지막 단계는 라이브러리를 닫고 차지하는 메모리를 확보하는 것입니다. 이것은 우리가 곧 그것을 사용 하려는 경우에 수행 해야 합니다. 우리가 할 경우 – 라이브러리 로드에 시간이 걸리기 때문에 열어 두는 것이 좋습니다.

라이브러리를 닫기 위해 dlclose(lib_handle)을 사용합니다. 이렇게하면 라이브러리에서 가져온 모든 리소스 (특히 실행 코드가 차지하는 메모리)가 해제됩니다. 또는 (libclass.a가 표준 라이브러리 경로에 배치되는 경우 /usr/local/lib) 모든 정적 라이브러리 함수는 다른 정적 라이브러리에서 함수 또는 프로시저를 호출할 수 있습니다. 링커와 로더는 다른 개체 파일의 종류와 동일한 방식으로 이 작업을 처리합니다. 정적 라이브러리 파일은 링크 로더(예: X11 모듈 로더)에 의해 런타임에 연결될 수 있습니다. 그러나 이러한 프로세스를 정적 연결이라고 할 수 있는지 여부는 논란의 여지가 있습니다. 4. 정적 라이브러리를 만듭니다. 이 단계는 하나의 정적 라이브러리에 여러 개체 파일을 번들로 묶는 것입니다(자세한 내용은 ar 참조). 이 단계의 출력은 정적 라이브러리입니다. 이제 두 개의 바이너리 오브젝트 파일 인 비주얼라이제이션 add.o와 sub.o가 있습니다.

이전 예제에서 만든 것처럼 작업 디렉토리에 add.o 파일이 있습니다.