Linux/Linux 과제

[임베디드 과제] GCC, G++ 컴파일러 이해

2sjin 2022. 10. 10. 23:35

1. GCC(GNU C Compiler)

  • c 파일은 C 언어로, cpp 파일을 C++ 언어로 컴파일함
  • C 라이브러리에 링크됨
  • 명령어: 실행 파일 생성
$ gcc [옵션] [파일명]

GCCC++, Java, Go, 포트란, 에이다 등 여러 언어를 컴파일할 수 있게 되면서, GCCGNU Compiler Collection의 약어로 쓰이게 됨

 

2) G++(GNU C++ Compiler)

  • c 파일과 cpp 파일 모두 C++ 언어로 컴파일함
  • C++ 라이브러리에 링크됨
  • 명령어: 실행 파일 생성
$ g++ [옵션] [파일명]

 

 

3) 컴파일 옵션

옵션 설명 및 예시
-o [filename] 실행 파일 이름을 특정 이름으로 생성함
(해당 옵션 없이 실행 파일이 생성될 경우, 기본 이름은 a.out)

-v 컴파일 상세 결과 출력
-g gdb를 통해 디버깅할 수 있도록 정보 생성
-save-temps 중간 과정 파일 보존(전처리, 오브젝트, 어셈블리 등)

-E 전처리 결과를 콘솔에 표준 출력함(컴파일은 하지 않음)

-c 실행 파일 대신 오브젝트 파일(.o) 생성

-S 실행 파일 대신 어셈블리 파일(.s) 생성

 
 
4) 라이브러리 링크 옵션
옵션 설명 및 실행 예시
-l[library] 라이브러리 이름을 작성(‘lib’, ‘.a’는 생략)
-L[directory] 라이브러리가 포함된 디렉토리를 작성
-shared 공유 라이브러리 우선 링크(Default)
-static 정적 라이브러리 우선 링크

 

공유 라이브러리와 정적 라이브러리

종류 설명
공유 라이브러리
(Shared Library)
■ 아카이브 파일명 형식: lib*.so
 프로그램이 실행될 때 라이브러리가 함께 메모리에 적재됨
 다른 프로그램에 의해 라이브러리가 이미 메모리에 적재된 경우에는 추가로 적재하지 않음
 실행 도중 라이브러리를 적재하므로, 실행 속도가 상대적으로 느림
정적 라이브러리
(Static Library)
 아카이브 파일명 형식: lib*.a
 라이브러리가 프로그램과 함께 컴파일됨
 상대적으로 실행 속도가 빠름, 이식성이 좋음
 파일 크기가 커짐, 메모리 및 저장공간의 비효율적 사용

 

라이브러리 아카이브 파일 생성 명령어

$ ar [옵션] [아카이브_파일명] [오브젝트_파일명]

 

자주쓰는 옵션 설명 및 실행 예시
r 아카이브 파일 내 존재하는 오브젝트 파일이면 덮어쓰기,
새로운 오브젝트 파일이면 신규 추가함
c 아카이브 파일이 존재하지 않으면 신규 생성함

 

라이브러리 링크 옵션 사용 예시

라이브러리에 포함할 소스 코드() 및 테스트 프로그램() 작성



 

 

목적 파일 생성

 

라이브러리 아카이브 파일 생성

 

GCC 컴파일 수행 및 프로그램 실행