Linux/Linux 과제
[임베디드 과제] GCC, G++ 컴파일러 이해
2sjin
2022. 10. 10. 23:35
1. GCC(GNU C Compiler)
- c 파일은 C 언어로, cpp 파일을 C++ 언어로 컴파일함
- C 라이브러리에 링크됨
- 명령어: 실행 파일 생성
$ gcc [옵션] [파일명]
※ GCC가 C++, Java, Go, 포트란, 에이다 등 여러 언어를 컴파일할 수 있게 되면서, GCC는 GNU 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 컴파일 수행 및 프로그램 실행