컴파일러
유닉스 계열 운영체제의 유틸리티와 상용 프로그램은 대부분 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 ## 실행파일 생성
'Linux' 카테고리의 다른 글
[리눅스] 유닉스/리눅스 (0) | 2022.10.16 |
---|---|
[리눅스] 시스템 프로그래밍 환경 - gdb 디버거 (0) | 2022.10.16 |
[리눅스] 시스템 프로그래밍 환경 - make (0) | 2022.10.14 |
[리눅스] 시스템 프로그래밍 환경 - vi (1) | 2022.10.14 |
[리눅스] 권한 및 쉘 (0) | 2022.10.04 |