Linux 동적 라이브러리 및 정적 라이브러리의 개념, 생성 및 사용

동적 및 정적 라이브러리

라이브러리의 연결 방법 : gcc / g ++ 컴파일러의 기본 연결 방법은 동적 연결입니다.
동적 연결 : 실행 프로그램을 생성하기 위해 동적 라이브러리를 연결하는 것은 라이브러리에있는 함수의 구현 명령을 직접 가져 와서 작성하지 않습니다. 실행 프로그램은 라이브러리에있는 함수의 기호 정보 테이블을 기록합니다. 실행 프로그램 실행시 동적 라이브러리를 메모리에로드합니다. 동적 라이브러리가 없으면 프로그램을 실행할 수 없습니다.
정적 링크 : 정적 라이브러리를 링크하여 실행 가능한 프로그램을 생성하고, 라이브러리에서 사용하는 함수의 구현 코드 명령을 실행 프로그램 파일에 직접 작성하며, 프로그램이 실행될 때 종속성이 없습니다.
여기에 사진 설명 삽입
동적 링크의 장단점 : 생성 된 실행 파일이 상대적으로 작고 런타임 라이브러리가 메모리에로드되며 여러 프로그램이 동일한 메모리 내 라이브러리 함수 코드를 사용할 수 있습니다. 단점은 런타임이 존재하지 않는 동적 라이브러리 존재 실행이 불가능하고 로딩 속도가 느립니다.

정적 링크의 장단점 : 프로그램은 다른 종속성없이 실행되며 직접 실행할 수 있습니다.로드 속도는 빠르지 만 실행 가능한 프로그램은 비교적 크고 여러 프로그램이 동일한 라이브러리에서 함수를 사용하는 경우이 코드는 함수는 런타임에 메모리를 갖게됩니다. 동일한 라이브러리 함수 코드의 여러 사본이 있으므로 중복이 발생합니다.

우리가 코드를 작성할 때 재사용되는 함수와 코드가 많이있을 것이고, 라이브러리에 패키징하면 함수와 코드를 어디에서나 사용할 수있어 프로그래밍 효율성이 크게 향상됩니다. 이제 라이브러리 함수를 패키징하는 방법을 살펴 보겠습니다.

동적 / 정적 라이브러리 패키징 및 사용

샘플 코드 :
child.c

//child.c
#include <stdio.h>

int printChild()
{
    
    
    printf("hello WhiteShirtI");
    return 0;
}

child.h

//child.h
int printChild();

main.c

//main.c
#include <stdio.h>
#include "child.h"

int main()
{
    
    
    printChild();
    return 0;
}

동적 라이브러리

1. 각 .c 파일을 오브젝트 파일로 컴파일하고 어셈블합니다
gcc -c -fPIC child.c -o child.o
. 2. .so로 끝나는 동적 라이브러리로 패키징합니다. 동적 라이브러리
gcc -share child.o -o libmychild.so의 이름 지정 방법 실행 파일을 생성 할 때 연결하고 사용lib***.so
여기에 사진 설명 삽입
하는 세 가지 방법
이 있습니다 . gcc main.c -o main -lmychild-l은 라이브러리를 지정합니다. 이름
여기에 사진 설명 삽입
그러나 라이브러리 파일을 찾을 수 없음을 발견했습니다. 링크하기 전에 라이브러리를 구성해야합니다. 동적 라이브러리에는 3 가지 방법이 있습니다.
1 라이브러리 파일을 지정된 경로에 넣습니다 . /usr/lib64아니면 /usr/lib
여기에 사진 설명 삽입
시스템 라이브러리에 넣으면 오염됩니다. 문의 원래 라이브러리
2. 링크의 검색 경로 환경 변수에 라이브러리 추가 라이브러리 파일이 위치한 경로 : export LIBRARY_PATH=$LIBRARY_PATH:.
여기에 사진 설명 삽입
. 3.에게 연결 라이브러리의 검색 경로를 지정하는 GCC의 -L 옵션보기
gcc main.c -o main -L./ -lmychild
여기에 사진 설명 삽입
ldd main동적를 실행 프로그램이 메인에 의존하는 라이브러리
여기에 사진 설명 삽입

성공적으로 연결할 수 있지만 주 프로그램을 성공적으로 실행할 수 없습니다.
여기에 사진 설명 삽입

실행 프로그램 실행시로드 및 사용 방법
1. 지정된 경로에 라이브러리 파일을 넣습니다. /usr/lib64또는 /usr/lib64
여기에 사진 설명 삽입
2. 링크 라이브러리의 연결 경로 환경 변수를 설정합니다. 라이브러리 파일이있는 경로를 추가합니다 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
여기에 사진 설명 삽입
. 링크가 동적 라이브러리 인 경우, 런타임에 실행됩니다. 동적 라이브러리를로드해야합니다. 링크가 정적 라이브러리 인 경우 런타임에로드 할 필요가 없습니다.

정적 라이브러리

1. 각 .c 파일을 객체 파일로 컴파일하고 어셈블합니다
gcc -c child.c -o child1.o
. 2. .a로 끝나는 정적 라이브러리로 패키징합니다. 정적 라이브러리
ar -cr libmyachild.a child1.o의 이름 지정 방법 lib***.a
여기에 사진 설명 삽입
프로그램을 정적 라이브러리에 연결하는 방법 :
1. 정적 라이브러리를 지정된 경로
gcc 기본적으로 동적 라이브러리가 사용됩니다. 그러면 어떻게 그가 정적 라이브러리를 사용할 수 있습니까?
우리의 정적 라이브러리를 파일에 넣고 링크 할 때 디렉토리로 가십시오 디렉토리에는 정적 라이브러리 만 있으므로 현재 정적 라이브러리 만 사용할 수 있습니다 gcc main.c -o main -L./lib -mychild
여기에 사진 설명 삽입
2. 모든 라이브러리에 정적 링크 사용 : gcc -static main.c -o main -L./lib -lmychild
여기에 사진 설명 삽입
새 버전 설치시 Linux 시스템에서 glibc-devel, glibc, gcc-c ++는 libc.a가 설치되지 않고 libc.so 만 설치되므로 -static을 사용하면 libc.a를 사용할 수 없습니다. libc를 찾을 수 없다는 것만보고 할 수 있습니다.
솔루션 :
glibc-static 설치
sudo yum install glibc-static

추천

출처blog.csdn.net/qq_44443986/article/details/115007235