ar을 사용하여 정적 라이브러리 만들기

하나, 정적 라이브러리를 알고

  1. .a를 접미사로 사용하십시오. 일반적으로 Linux에서는 libxxx.a로 명명됩니다.
  2. 프로그램이 정적 라이브러리를 사용할 때 링커 (ld)는 전체 libxxx.a의 모든 함수를 실행 파일에 복사합니다.

2. 장점과 단점

장점 : 정적 라이브러리를 사용할 때 실행 파일로 컴파일 한 후 런타임시 라이브러리에 의존하지 않습니다.

단점 : 실행 파일이 크고 정적 라이브러리가 변경되었으므로 실행 파일을 다시 생성해야합니다.

셋째, 정적 라이브러리를 만들고 사용하는 방법

도구 : ar, 개체 파일 .o를 별도의 정적 라이브러리로 패키지화합니다.

Linux에서 정적 라이브러리를 만드는 단계 :

  1. 소스 코드 파일 (.c, .cpp) 편집
  2. gcc -c * .c를 통해 개체 파일 * .o 생성 또는 g ++ -c * .cpp 접기
  3. ar을 사용하여 개체 파일을 패키징하고 정적 라이브러리 생성
  4. 정적 라이브러리에 대한 헤더 파일 제공 (즉, 정적 라이브러리에서 제공하는 서비스 인터페이스와 같은 * .h 파일)

ar 명령의 사용 :

형식 : ar [-] {dmpqrtx} [abcfilNoPsSuvV] [membername] [count] 아카이브 파일 ...

매개 변수 :

 명령 매개 변수 

  -d 라이브러리 파일에서 구성원 파일 삭제

 -m 라이브러리 파일에서 구성원 파일의 순서를 변경합니다. 

-p는 라이브러리 파일에있는 구성원 파일의 내용을 표시합니다. 

-q 파일을 라이브러리 파일 끝에 추가합니다. 

-r 라이브러리 파일에 파일 삽입

-t는 라이브러리 파일에 포함 된 파일을 표시합니다. 

-x 라이브러리 파일에서 구성원 파일 제거

옵션 매개 변수

a <멤버 파일> 라이브러리 파일에 지정된 멤버 파일 뒤에 파일을 삽입합니다.

b <멤버 파일> 라이브러리 파일에 지정된 멤버 파일 앞에 파일을 삽입합니다.

c 라이브러리 파일을 만듭니다.

f 긴 파일 이름이 다른 시스템의 ar 명령과 호환되지 않는 것을 방지하기 위해이 매개 변수를 사용하여 라이브러리 파일에 넣을 긴 멤버 파일 이름을 잘라낼 수 있습니다.

i <멤버 파일> 라이브러리 파일에 지정된 멤버 파일 앞에 멤버를 삽입합니다.

o 라이브러리 파일에 파일 날짜를 유지합니다.

■ 객체 모드가 라이브러리 파일에 포함 된 경우이 매개 변수를 사용하여 저장할 파일의 기호 테이블을 만들 수 있습니다.

S는 기호 테이블을 생성하지 않습니다.

u 최신 날짜의 파일 만 라이브러리 파일에 삽입하십시오.

v 프로그램이 실행될 때 자세한 정보를 표시합니다.

V 버전 정보를 표시합니다.

네, 밤

test.h

int add(int a, int b);

test.cpp

#include "test.h"

int add(int a, int b)
{
    return (a + b);
}

엮다:

[xy@xunye ar]$ g++ -c test.cpp 
[xy@xunye ar]$ ls
test.cpp  test.h  test.o

정적 라이브러리를 만듭니다.

[xy@xunye ar]$ ar rcs libtest.a *.o
[xy@xunye ar]$ ls
libtest.a  test.cpp  test.h  test.o

정적 라이브러리 사용 :

main.cpp

#include "test.h"
#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
    cout << add(3, 2) << endl;

    return 0;
}

실행 파일을 만듭니다.

[xy@xunye use_lib]$ ls
libtest.a  main.cpp  test.h
[xy@xunye use_lib]$ g++ -o main main.cpp -L. -ltest
[xy@xunye use_lib]$ ls
libtest.a  main  main.cpp  test.h
[xy@xunye use_lib]$ ./main 
5

설명 : -L은 g ++가 정적 라이브러리를 검색 할 경로를 지정합니다. "."는 현재 경로에서 검색 함을 의미합니다.

          -l은 특정 라이브러리를 지정합니다. 그 중에서 lib 및 .a는 표시하지 않고 작성할 수 있습니다.

[Note] 라이브러리에서 gcc 또는 g ++를 검색하는 순서 : 먼저 동적 라이브러리 .so를 찾고, 찾을 수 없으면 정적 라이브러리 .a를 찾습니다.

추천

출처blog.csdn.net/xunye_dream/article/details/110727531