[Linux] 정적 라이브러리와 동적 라이브러리의 생성 및 호출

4909 단어 linux
1, 라이브러리: 실행 가능한 코드의 이진 형식으로 메모리에 불러와 실행할 수 있습니다.그 중에서 라이브러리는 정적 라이브러리, 동적 라이브러리로 나뉜다.
둘째, 정적 라이브러리와 동적 라이브러리의 차이
1) Linux에서 정적 라이브러리: 일반적으로 lib**.A는 정적 함수 라이브러리를 이용하여 컴파일한 파일이 비교적 크다. 전체 함수 라이브러리의 모든 데이터가 목표 코드에 통합되기 때문에 그의 장점은 뚜렷하다. 즉, 컴파일된 실행 프로그램은 외부의 함수 라이브러리 지원을 필요로 하지 않는다. 왜냐하면 모든 사용된 함수가 이미 컴파일되었기 때문이다.물론 이것도 그의 단점이 될 수 있다. 정적 함수 라이브러리가 바뀌면 프로그램이 다시 컴파일되어야 하기 때문이다.
2) Linux에서 동적 라이브러리: 이 라이브러리의 이름은 보통libxxx입니다.so;정적 함수 라이브러리에 비해 동적 함수 라이브러리는 컴파일할 때 목표 코드에 컴파일되지 않고 프로그램이 관련 함수에 실행될 때 해당 함수 라이브러리에 있는 함수를 호출하기 때문에 동적 함수 라이브러리에서 발생하는 실행 가능한 파일은 비교적 작다.함수 라이브러리는 프로그램에 통합되지 않고 프로그램이 실행될 때 동적 신청을 하고 호출되기 때문에 프로그램의 운영 환경에 해당하는 라이브러리를 제공해야 합니다.동적 함수 라이브러리의 변화는 프로그램에 영향을 주지 않기 때문에 동적 함수 라이브러리의 업그레이드가 비교적 편리하다.linux 시스템에는/lib/usr/lib 같은 몇 가지 중요한 디렉터리가 있습니다.
셋째, 정적 라이브러리의 사용
조작 도구:gcc와ar 명령
1) 디자인 라이브러리의 소스 코드
part1.c:
void print1()
{
  printf("This is the first lib src
"); }

part2.c
void print2()
{
  printf("This is the secound lib src
"); }

2) 컴파일.c 파일:
gcc -O -c part1.c part2.c
part1 생성o 및 part2.o 파일
3) 정적 라이브러리 링크
ar -rsv libpart.a part1.o part2.o
-r replace existing or insert new file(s) into the archive
-s replace existing or insert new file(s) into the archive
-v replace existing or insert new file(s) into the archive
4) 라이브러리 소스 코드 호출
main.c
int main()
{
   print1();
   print2();

  return 0;
}

5) 라이브러리 컴파일 및 링크
gcc -o main main.c -L ./-lpart//잊지 말아요 - lpart
설명: - L 뒤에 있는 라이브러리 경로 -l***는 정적 라이브러리lib**입니다.a에서lib와.이름
./main//실행
출력:
This is the first lib src!
This is the second src lib!
넷째, 동적 라이브러리의 사용
1) 라이브러리 코드 파트 설계c
#include <stdio.h>  //      
int p=8;
void print1()
{
  printf("This is the first so src
"); }

2) 동적 라이브러리 생성
gcc -O -fpic -shared -o dl.so pr1.c
-fpic: -f 뒤에 컴파일 옵션이 있습니다. PIC는 위치 무관 코드 생성(Position Independent Code)을 나타냅니다.
3) 함수 쓰기 호출
int main()
{
   print1();
  return 0;
}

4) 컴파일 호출
gcc -o main ./dl.so
실행:./main
출력:
This is the first so src

6, 동적 라이브러리의 현식 호출
현식 호출 동적 라이브러리는 네 개의 함수 지원이 필요합니다. 함수 dlopen은 동적 라이브러리를 열고 함수 dlsym는 동적 라이브러리의 대상 주소를 가져오며 함수 dlerror는 현식 동적 라이브러리 작업 중의 오류 정보를 가져오고 함수 doclose는 동적 라이브러리를 닫습니다.
호출 코드:main.c
#include <dlfcn.h> 
#include <stdio.h>
int main() 
{ 
      void *pHandle; 
      void (*pFunc)();    //          
      int *p; 
      pHandle = dlopen("./dl.so", RTLD_NOW); //        
      if(!pHandle){ 
                    printf("Can't find dl.so 
"); // exit(1); } pFunc = (void (*)())dlsym(pHandle, "print1"); // print if(pFunc) pFunc(); else printf("Can't find function print
"); p = (int *)dlsym(pHandle, "p"); // p if(p) printf("p = %d
", *p); else printf("Can't find int p
"); dlclose(pHandle); // return 0; }

컴파일 호출: gcc -o main main.c -L ./-ldl
전제:지금 당장./main, 동적 함수 라이브러리에서 사용할 때/usr/lib,/lib 디렉터리에 있는 동적 함수 라이브러리를 찾을 수 있기 때문에, 우리가 생성한 라이브러리는 안에 없습니다.이때 그가 성공적으로 운행할 수 있는 몇 가지 방법이 있다. 가장 직접적이고 가장 간단한 방법은dl이다.so/usr/lib 또는/lib로 끌어옵니다.한 가지 방법이 있는데 export LDLIBRARY_PATH=$(pwd) 또는/etc/ld.so.conf 파일에 우리가 생성한 라이브러리의 디렉터리를 추가한 다음/sbin/ldconfig./etc/ld.so.conf는 매우 중요한 디렉터리입니다. 링크기와 마운트가 공유 라이브러리를 검색할 때 검사할 디렉터리입니다. 기본적으로/usr/lib/lib에서 읽습니다. 따라서 순조롭게 실행하려면 라이브러리의 디렉터리를 이 파일에 추가하고/sbin/ldconfig를 실행할 수 있습니다.그리고/etc/ld에 대해 알아야 할 파일이 있습니다.so.캐시, 그 안에 자주 사용하는 동적 함수 라이브러리가 저장되어 있고 그들을 메모리에 먼저 불러올 것이다. 메모리의 접근 속도가 하드디스크의 접근 속도보다 훨씬 높기 때문에 소프트웨어가 동적 함수 라이브러리를 불러오는 속도를 높일 수 있다.
Dell은 다음을 지원합니다. export LDLIBRARY_PATH=$(pwd) 가능 echo $LDLIBRARY_PATH 한번 봐주세요.
실행:./main
출력: This is the first so src p = 8
7, 라이브러리 종속 보기
실행 파일이 어떤 라이브러리에 의존하는지 보기 위해ldd 명령을 사용하십시오.
이 명령은 실행 가능한binary 파일에 어떤 동적 편지 라이브러리가 있는지 판단하는 데 사용됩니다.[root@testroot] # ldd [-vdr] [filename] 매개 변수 설명: --version 인쇄ldd의 버전 번호-v --verbose는 기호를 포함한 버전 정보-d --data-relocs 실행 기호 재배치, 부족한 대상 대상(ELF 형식에만 적용) - r --function-relocs 대상 대상과 함수에 대한 재배치, 부족한 대상 대상과 함수(ELF 형식에만 적용) 보고
명령줄에 지정된 라이브러리 이름이 '/' 을 포함한다면, 이 프로그램의libc5 버전은 라이브러리 이름으로 사용할 것입니다.그렇지 않으면 표준 위치에서 라이브러리를 검색합니다.현재 디렉토리의 공유 라이브러리를 실행하고 접두어 "./"를 붙입니다.

좋은 웹페이지 즐겨찾기