반응형
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
반응형
'programing' 카테고리의 다른 글
Java 8에서 목록 목록을 목록으로 변환하려면 어떻게 해야 합니까? (0) | 2022.08.15 |
---|---|
jquery에서 동적으로 추가된 html에 vuejs 구성 요소를 렌더링하는 방법 (0) | 2022.08.15 |
Java에서 목록을 쉼표로 구분된 문자열로 변환하는 가장 좋은 방법 (0) | 2022.08.15 |
데이터가 Vuex에 아직 유지되지 않은 경우 형제 구성 요소 간에 데이터를 공유하시겠습니까? (0) | 2022.08.15 |
Java에서는 XML을 파일이 아닌 문자열로 해석하려면 어떻게 해야 합니까? (0) | 2022.08.15 |