리눅스 기본 사항:정적 라이브러리 대 동적 라이브러리

에리카 카오일리

팔로우

2019 년 12 월 17 일·4 분 읽기

언 플래시에 에드윈 안드레이드 사진

리눅스에서 도서관이란 무엇인가?

왜 우리는 도서관을 사용합니까?

정적 및 동적 라이브러리를 만드는 방법?5383>

어떻게 그리고 왜 우리는 그들을 사용합니까?

리눅스의 라이브러리

라이브러리는 함수라는 미리 컴파일 된 코드 조각의 모음입니다. 라이브러리는 일반적인 기능을 포함하고 함께,그들은라는 패키지를 형성—라이브러리를. 함수는 프로그램 전체에서 재사용되는 코드 블록입니다. 프로그램에서 코드 조각을 다시 사용하면 시간이 절약됩니다. 이 코드를 여러 번 다시 작성 프로그래머를 유지합니다. 프로그래머의 경우 라이브러리는 재사용 가능한 함수,데이터 구조,클래스 등을 제공합니다.

“예를 들어,수학 연산을 수행해야 하는 응용 프로그램을 빌드하는 경우 새 수학 함수를 만들 필요가 없으며 해당 프로그래밍 언어에 대한 라이브러리의 기존 함수를 간단히 사용할 수 있습니다.”(“리눅스에서 공유 라이브러리 이해”)

라이브러리는 실행 가능하지 않으며 프로세스 및 응용 프로그램과의 주요 차이점입니다. 라이브러리는 런타임 또는 컴파일 타임에 해당 역할을 수행합니다. 동적 라이브러리와 정적 라이브러리:씨 프로그래밍 언어에서,우리는 라이브러리의 두 가지 유형이 있습니다.

라이브러리에는"-c" gcc flag 가 만든 객체 파일이 있고 규칙에 따라".o"로 끝납니다. 컴파일러 출력의 결과이며 이진 형식의 함수 정의를 포함합니다.

동적 라이브러리와 정적 라이브러리의 차이점

따라서”명명 규칙과 정적 라이브러리에는”*가 있습니다.”.

동적 또는 공유 라이브러리는 실행 파일 외부의 개별 파일로 발생합니다. 따라서 런타임에 라이브러리 파일의 복사본 하나만 필요합니다. 컴파일 타임에 정적 라이브러리는 프로그램에 잠겨 있습니다. 여기에는 컴파일 타임에 라이브러리 파일의 복사본을 보유하는 파일의 프로그램이 포함되어 있습니다.

동적 라이브러리를 사용할 때 프로그래머는 런타임에 필요할 때 해당 라이브러리를 참조합니다. 예를 들어,standard input/output header file에서 문자열 길이 함수에 액세스하려면 동적으로 액세스 할 수 있습니다. 이 때문에 동적 로더의 런타임에 프로그램의 라이브러리 참조를 찾을 수 있습니다. 그런 다음 해당 문자열 길이 함수를 메모리에로드합니다. 따라서 동적 라이브러리 접근성을 쉽게 사용할 수 있어야 하거나 무력해진다.

동적 라이브러리의 장점과 단점

  1. 런타임에 하나의 복사본 만 필요합니다. 응용 프로그램 및 서로 밀접 하 게 사용할 수 있는 라이브러리에 따라 달라 집니다.
  2. 실행중인 여러 응용 프로그램은 각 파일에 자체 복사본이 필요없이 동일한 라이브러리를 사용합니다.
  3. 그러나 동적 라이브러리가 손상되면 어떻게됩니까? 이 실행 파일의 외부에 살고 파괴에 취약하기 때문에 실행 파일이 작동하지 않을 수 있습니다.
  4. 그들은 작은 파일을 보유.
  5. 동적 라이브러리는 런타임에 연결됩니다. 프로그래머가 변경할 때 다시 컴파일 및 다시 연결이 필요하지 않습니다.

컴파일 타임에 응용 프로그램은 정적 라이브러리를 사용합니다. 함수의 모든 복사본은 프로세스를 실행하는 데 필요하기 때문에 응용 프로그램 파일에 배치됩니다.

정적 라이브러리의 장점과 단점

  1. 정적 라이브러리는 실행 파일 내부에 존재하기 때문에 취약점에 저항합니다.
  2. 객체 코드(바이너리)가 실행 파일에 있기 때문에 런타임 속도가 더 빨라집니다. 따라서 함수에 대한 호출이 더 빨리 실행됩니다. 동적 라이브러리는 실행 파일 외부에 있으므로 실행 파일 외부에서 호출됩니다.
  3. 파일 및 프로그램을 변경하려면 다시 연결하고 다시 컴파일해야 합니다.
  4. 파일 크기가 훨씬 큽니다.

정적 및 동적 라이브러리를 어떻게 생성합니까?

두 라이브러리 모두에 대해 프로그램은 라이브러리에 있는 각 함수에 대해prototype을 포함해야 합니다. 헤더 파일을 사용하는 경우header filename를 포함하는 것을 잊지 마십시오.

#include "<header file name>"

동적 라이브러리

동적 라이브러리를 만들려면 다음 명령을 작성하십시오:

gcc -g -fPIC -Wall -Werror -Wextra -pedantic *.c -shared -o liball.so

-fPIC플래그를 사용하면 런타임에 가상 주소에서 다음 코드를 참조할 수 있습니다. 그것은 위치 독립적 인 코드를 의미합니다.라이브러리는 프로그램 간에 메모리의 위치가 변경되므로 고정된 주소에 데이터를 보관하지 않습니다. 개체 파일은-shared flag를 사용하여 컴파일됩니다. compiler은 나중에"lib"로 시작하여 명명 규칙으로 끝나는 파일을 검색하여 라이브러리를 식별합니다, .so

이 프로그램은 라이브러리 파일을 찾기 위해 경로가 필요합니다. 따라서 다음 명령을 입력하여 해당 위치를 환경 변수에 추가해야 합니다LD_LIBRARY_PATH.

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

동적 라이브러리를 사용하는 경우 다음 명령을 입력합니다:

gcc -g -wall -o app app.c liball.so

정적 라이브러리

정적 라이브러리를 만들려면 다음 명령을 사용해야합니다:

ar rc liball.a dog.o cat.o bird.o

"ar"archive를 나타내며 정적 라이브러리를 만드는 데 사용됩니다. ".o"로 끝나는 모든 파일은liball.a library에 추가되며 이 경우 개체 파일입니다.

-rc flag는 두 가지 작업을 수행합니다. 다음 단계는 인덱싱입니다,그렇게하기 위해,우리는 입력:

ranlib liball.a

정적 라이브러리를 사용하는 경우 다음 명령을 입력합니다:

gcc main.c -L -l<filename>

-L flag linker에 액세스하므로 주어진 디렉토리에서 라이브러리를 찾을 수 있습니다. 또한 컴파일러가 시스템 라이브러리를 찾는 다른 위치도 검색합니다.

답글 남기기

이메일 주소는 공개되지 않습니다.