프로그그래밍에서 디버깅과 빌드 자동화는 개발자가 효율적으로 코드를 작성하고 유지 보수하는데 필수적인 과정이다. C언어는 저수준 언어의 특성을 가지고 있어서 디버깅과 빌드 자동화의 중요성이 더욱 강조된다.
GCC를 사용하여 디버깅 정보를 포함시키려면 -g옵션을 사용한다.
gcc -g -o program source_file.c
그 후에 gdb(GNU Debugger)같은 디버거를 사용하여 프로그램을 디버깅한다.
gdb ./program
MakeFile은 소프트웨어 빌드 자동화 도구인 make의 설정 파일이다. 대규모 소프트웨어 프로젝트에서 소스 코드 파일을 컴파일하고 관련 파일을 링크하여 실행 가능한 프로그램을 만드는 복잡한 과정을 간소화하고 자동화하기 위한 프로그램이다.
make 유틸리티를 사용할 때, 이 유틸리티는 MakeFile이라는 특별한 파일을 찾아 지시에 따라 작업을 수행한다. MakeFIle을 명령어를 미리 정의해두고, 필요할 때 해당 명령어들을 순서대로 실행하여 빌드 과정을 자동화 한다.
원래 소프트웨어 프로젝트에서 소스 파일을 수동으로 컴파일하고 링크하는 것은 시간이 많이 걸리고, 에러가 발생하기 쉬운 과정이었다. 이러한 문제를 해결하기 위해 빌드 자동화 도구가 필요했고, 그 결과 MakeFIle과 make 유틸리티가 개발되었다.
target: dependencies
command
CC = gcc
CFLAGS = -Wall -g
SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)
TARGET = program
SRCS=$(wildcard *.c)
SRCS: 이것은 Source Files의 약자로, 소스 파일 목록을 저장하는 변수명입니다.
=: 변수를 정의할 때 사용하는 대입 연산자입니다.
$(wildcard *.c): wildcard 함수를 호출하며, *.c 패턴에 일치하는 모든 파일을 확장합니다.
즉, 현재 디렉토리에 있는 모든 C 소스 파일(.c로 끝나는 파일)의 목록을 생성합니다.
OBJS = $(SRCS:.c=.o)
자동 변수 치환을 사용 한 것이다. 이 구문은 SRCS 변수에 저장된 값들 중에서 .c로 끝나는 부분을 모두 .o로 치환하는 것이다.
make 명령어를 입력했을 때 실행된다.all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $@ $^
$@
현재 타겟의 이름을 타나낸다. 예를 들어 all:program 규칙에서 $@는 all이 된다.
$^
현재 타겟의 모든 의존성들의 리스트를 나타낸다. 의존성들은 공백으로 구분되며, 중복은 제거된다.
ex)
program: main.o utils.o
gcc -o $@ $^
# $@는 program을 나타냅니다. 따라서 gcc -o program ...가 된다.
# $^는 main.o utils.o을 나타냅니다. 따라서 gcc ... main.o utils.o가 된다.
$<를 사용하여 현재의 의존성 소스 파일을 가리킨다.%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean 타겟을 정의한다. 이 타겟은 .PHONY로 표시해야 한다. 이는 clean이라는 파일과 중돌나지 않도록 하기 위함이다..PHONY: clean
clean:
rm -f $(OBJS) $(TARGET)
.PHONY: install
install:
cp $(TARGET) /usr/local/bin/
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)
# This is a comment explaining the following command
$(CC) $(CFLAGS) -o $@ $^