programing

Linux에서 정적 라이브러리를 컴파일하는 방법

firstcheck 2022. 8. 15. 10:56
반응형

Linux에서 정적 라이브러리를 컴파일하는 방법

질문이 있습니다.Linux에서 정적 라이브러리를 컴파일하는 방법gcc즉, 소스 코드를 out.a라는 파일로 컴파일해야 합니다.명령어를 사용하여 컴파일만 하면 됩니까?gcc -o out.a out.c잘 모르는데?gcc누가 좀 도와주면 좋겠는데

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

gcc -c -o out.o out.c

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

ar rcs libout.a out.o
 

그러면 정적 라이브러리가 생성됩니다. r교체하여 삽입하는 방법,c새로운 아카이브를 작성하는 방법 및s색인을 작성하는 것을 의미합니다.항상 그렇듯이 자세한 내용은 man 페이지를 참조하십시오.

다음은 전체 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)

make file 설명:

  • target: prerequisites- 규칙 헤드
  • $@- 타겟을 의미합니다.
  • $^- 모든 전제 조건을 의미합니다.
  • $<- 첫 번째 전제 조건만 의미합니다.
  • ar- 아카이브에서 작성, 변경 및 추출하기 위한 Linux 도구는 man 페이지를 참조하십시오.이 경우 옵션은 다음과 같습니다.
    • r- 아카이브 내에 있는 파일을 치환합니다.
    • c- 아카이브가 존재하지 않는 경우 작성
    • s- 오브젝트 파일 인덱스를 아카이브에 만듭니다.

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

메인 lib 사용

#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 first 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 */

gcc를 사용하여 오브젝트 파일을 생성한 후ar정적 라이브러리로 묶는 거죠

언급URL : https://stackoverflow.com/questions/2734719/how-to-compile-a-static-library-in-linux

반응형