맞는데 왜 틀릴까..?

Linux

[리눅스] 시스템 프로그래밍 환경 - gcc 컴파일러

안도일 2022. 10. 14. 21:39

컴파일러

 

 

유닉스 계열 운영체제의 유틸리티와 상용 프로그램은 대부분 C언어로 작성

유닉스와 리눅스는 운영체제 자체가 C언어로 작성

공개된 C 컴파일러로 gcc 컴파일러가 널리 사용됨

 

gcc 컴파일러

 

컴파일

gcc long.c  
a.out        ## 기본 실행 파일 생성

 

-c 옵션

gcc -c long.c ## 목적 파일(.o)까지 생성

 

-o 옵션

gcc -o long long.c  ## a.out 대신의 별도의 실행파일 지정 
./long              ## 실행파일

 

-O 옵션

-O0 : 최적화를 수행하지 않는다

-O1, O2 : 최적화를 수행한다 (O2가 기본 옵션)

-O3 : 가장 높은 레벨의 최적화 (사용상 주의 필요)

-Os : 사이즈 최적화

gcc -O0 sqrt.c   ## sqrt.c를 최적화를 수행하지 않고 컴파일

 

-I (대문자 i) 옵션

헤더 파일의 디텍토리 위치를 명시적으로 지정

#include <file.h> 는 /usr/include 에서 찾고  #include "file.h"는 현재 디렉토리에서 찾음

따라서 #include <file.h>로 쓰고 싶을 때 사용함

gcc -o filename file.c -Idirname

 

-L 옵션

라이브러리의 디렉토리 위치를 명시적으로 지정함

사용자가 별도의 라이브러리를 생성할 경우 /usr/lib에 삽입하는 것보다 별도의 디렉토리에서 관리하는 것이 바람직함

gcc -o filename filename.c -lmy -L. ## 현재 디렉토리에 있는 libmy.a 라이브러리를 사용함

 

 

라이브러리 링크

 

-l (소문자 L) 옵션 : 컴파일에 사용되는 라이브러리 링크

-lxxx 는 보통 /usr/lib 디렉토리에 있는 libxxx.a를 링크하라는 의미

gcc -o test -lm test.c ## /usr/lib 디렉토리에 있는 libm.a(math library) 를 링크한 것

 

 

예제 문제

 

작업 디렉토리 ~/work 에서 ls 명령을 실행하였을 때 결과는 아래와 같을 때 적절한 컴파일 명령은?

main.c node.c my.h libcom.a

gcc -o main main.c node.c my.h -I. -lcom -L. 
## -I. : my.h가 현재 디렉토리에 있다. 
## -lcom -L. : libcom.a라는 라이브러리가 현재 디렉토리에 있다

 

 

 

컴파일 과정 중 생성되는 파일

 

C 소스코드 (.c)

전처리된 C 소스코드 (.i)

어셈블리 코드 (.s)

오브젝트 코드 (.o) - 바이너리 파일, 라이브러리 ex) libc.a, libm.a

최적화된 오브젝트 코드 (.o) - 실행파일 최적화 (속도, 크기 등)

실행파일 (a.out)

 

 

심볼 정의 (-DVALUE option)

 

 

ex2.c의 코드가 위와 같을 때 gcc ex2.c를 사용하면 아래와 같이 에러가 발생함

 

 

gcc -DVALUE=1999 ex2.c ## -D[macro]=[macro_value]는 #define macro macro_value를 추가한것과 동일함

 

소스 코드에 명시적으로 수정되는 것이 아니라, 컴파일 단계에 가변적으로 다른 값을 할당하여 디버깅 등의 용도로 활용될 수 있음


다중 모듈 프로그램

 

여러 개의. c 파일들로 이루어진 프로그램

일반적으로 복잡하며 대단위 프로그램의 개발에 적합

 

 

컴파일

 

main 프로그램과 copy 함수를 분리하여 별도 파일로 작성

main.c

copy.c

copy.h

gcc -c main.c             ## 목적파일 생성
gcc -c copy.c
gcc -o main main.o copy.o ## 실행파일 생성