Linux에서 정적 라이브러리를 컴파일하는 방법은 무엇입니까?


138

질문이 있습니다 :로 Linux에서 정적 라이브러리를 컴파일하는 방법 gcc, 즉 소스 코드를 out.a라는 파일로 컴파일해야합니다. 명령으로 간단히 컴파일하면 충분 gcc -o out.a out.c합니까? 에 익숙하지 않습니다. gcc누구나 나에게 손을 줄 수 있기를 바랍니다.


답변:


206

gnu 컴파일러를 사용하여 공유 및 정적 라이브러리 작성 [gcc]을 참조하십시오 .

gcc -c -o out.o out.c

-c 실행 파일이 아닌 중개 개체 파일을 만드는 것을 의미합니다.

ar rcs libout.a out.o

정적 라이브러리가 생성됩니다. r대체로 삽입하는 c방법, 새 아카이브를 만드는 방법 및 s인덱스를 쓰는 방법을 의미합니다. 항상 그렇듯이 자세한 내용은 맨 페이지 를 참조하십시오.


90

전체 makefile 예제는 다음과 같습니다.

makefile

TARGET = prog

$(TARGET): main.o lib.a
    gcc $^ -o $@

main.o: main.c
    gcc -c $< -o $@

lib.a: lib1.o lib2.o
    ar rcs $@ $^

lib1.o: lib1.c lib1.h
    gcc -c -o $@ $<

lib2.o: lib2.c lib2.h
    gcc -c -o $@ $<

clean:
    rm -f *.o *.a $(TARGET)

메이크 파일 설명 :

  • target: prerequisites -룰 헤드
  • $@ -목표를 의미
  • $^ -모든 전제 조건을 의미
  • $< -첫 번째 전제 조건을 의미
  • ar-아카이브를 생성, 수정 및 추출하는 Linux 도구에 대한 자세한 내용은 매뉴얼 페이지를 참조하십시오 . 이 경우의 옵션은 다음을 의미합니다.
    • r -아카이브 내에 존재하는 파일을 교체
    • c -아직 존재하지 않는 경우 아카이브를 만듭니다.
    • s -아카이브에 객체 파일 인덱스를 만듭니다.

결론 : 리눅스에서 정적 라이브러리는 객체 파일의 아카이브에 지나지 않습니다.

lib를 사용하는 main.c

#include <stdio.h>

#include "lib.h"

int main ( void )
{
    fun1(10);
    fun2(10);
    return 0;
}

lib.h libs 메인 헤더

#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED

#include "lib1.h"
#include "lib2.h"

#endif

lib1.c 첫 번째 lib 소스

#include "lib1.h"

#include <stdio.h>

void fun1 ( int x )
{
    printf("%i\n",x);
}

lib1.h 해당 헤더

#ifndef LIB1_H_INCLUDED
#define LIB1_H_INCLUDED

#ifdef __cplusplus
   extern C {
#endif

void fun1 ( int x );

#ifdef __cplusplus
   }
#endif

#endif /* LIB1_H_INCLUDED */

lib2.c 두 번째 lib 소스

#include "lib2.h"

#include <stdio.h>

void fun2 ( int x )
{
    printf("%i\n",2*x);
}

lib2.h 해당 헤더

#ifndef LIB2_H_INCLUDED
#define LIB2_H_INCLUDED

#ifdef __cplusplus
   extern C {
#endif

void fun2 ( int x );

#ifdef __cplusplus
   }
#endif

#endif /* LIB2_H_INCLUDED */

명령이 수행하는 작업과 수행하려는 작업을 지적하는 데 도움이되었을 것입니다. 특히이 경우 ar정적 라이브러리를 작성하는 데 핵심이므로 설명 이 필요합니다.
Joost

1
ar프로그램은 아카이브에서 다른 파일 모음을 보유하는 단일 파일 인 원본 파일을 검색 할 수있는 단일 파일 인 아카이브에서 작성, 수정 및 추출합니다. ar수정자를 지정할 때 아카이브에서 변동 가능 객체 모듈에 정의 된 기호에 대한 색인을 작성합니다. (참조 man ar)
Alex44

2
c++컴파일러 를 지원하기 위해 헤더에 다음 줄을 추가하십시오 : #ifdef __cplusplus extern "C" { #endif . . . #ifdef __cplusplus } #endif
Behrouz.M

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.