42 정리

수현·2023년 7월 14일
0

42Seoul

목록 보기
8/8

📒 Makefile

1) Makefile 구성

  • make : 주어진 쉘 명령어들을 조건에 맞게 실행하는 프로그램

  • target : 어떤 것을 make 할 지 전달할 대상

  • prerequisities (필요 조건들) : 주어진 타겟을 make할 때 사용될 파일들의 목록 (= 의존 파일)

    • 주어진 파일들의 수정 시간보다 타겟이 나중에 수정 되었다면 해당 타겟의 명령어 실행x
  • recipes (실행할 명령어) : 타겟을 make 할 때 실행할 명령어의 나열

    • 명령어 쓸 때 탭 1번 들여쓰기 필수
  • 변수

    • $@ : 타겟 이름에 대응
    • $< : dependency 목록에 첫 번째 파일에 대응
    • $^ : dependency 파일 목록 전체에 대응
    • $? : 타겟 보다 최신 dependency 파일에 대응
    • $+ : $^와 유사하지만, 중복된 파일 이름까지 모두 포함
    • $* : 타겟 이름에서 확장자가 없는 이름
    • $% : 타겟의 이름 (해당 규칙 대상이 아카이브인 경우)
CC = g++

# C++ 컴파일러 옵션
CXXFLAGS = -Wall -O2

# 링커 옵션
LDFLAGS =

# 헤더파일 경로
INCLUDE = -Iinclude/

# 소스 파일 디렉토리
SRC_DIR = ./src

# 오브젝트 파일 디렉토리
OBJ_DIR = ./obj

# 생성하고자 하는 실행 파일 이름
TARGET = main

# Make 할 소스 파일들
# wildcard 로 SRC_DIR 에서 *.cc 로 된 파일들 목록을 뽑아낸 뒤에
# notdir 로 파일 이름만 뽑아낸다.
# (e.g SRCS 는 foo.cc bar.cc main.cc 가 된다.)
SRCS = $(notdir $(wildcard $(SRC_DIR)/*.cc))

OBJS = $(SRCS:.cc=.o)
DEPS = $(SRCS:.cc=.d)

# OBJS 안의 object 파일들 이름 앞에 $(OBJ_DIR)/ 을 붙인다.
OBJECTS = $(patsubst %.o,$(OBJ_DIR)/%.o,$(OBJS))
DEPS = $(OBJECTS:.o=.d)

all: main

$(OBJ_DIR)/%.o : $(SRC_DIR)/%.cc
	$(CC) $(CXXFLAGS) $(INCLUDE) -c $< -o $@ -MD $(LDFLAGS)

$(TARGET) : $(OBJECTS)
	$(CC) $(CXXFLAGS) $(OBJECTS) -o $(TARGET) $(LDFLAGS)

.PHONY: clean all
clean:
	rm -f $(OBJECTS) $(DEPS) $(TARGET)

-include $(DEPS)

내부적으로 정의되어 있는 확장자 규칙

  • make는 사용자가 내리는 명령을 알아서 해석해 컴파일 과정 자동화
    • *.c 파일의 확장자를 보고 c프로그래밍 소스 파일로 인식
    • c파일의 오브젝트(컴파일러 -c 옵션)로 컴파일하면 *.o 파일 생성
  • Makefile에 확장자 규칙을 재정의
    • 내부적으로 정의된 확장자 규칙을 재정의하여 다양한 컴파일 옵션 사용 목적
    • .SUFFIXES라는 특수 타겟 필요
    • .SUFFIXES의 종속 항목 : 확장자 규칙을 검사하는데 사용되는 확장자들의 리스트

  • SRCS = $(wildcard .c) : 현재 디렉토리에서 .c와 파일명이 일치하는 파일을 찾아 공백을 구분 문자로 SRCS 매크로에 정의

  • OBJECTS = $(SRCS:.c=.o) : 대입 참조 기법을 통해 확장자 .c가 .o로 바뀜

자주 사용 문법

  • $(addsuffix 접미사, 문자열) : $(addsufix .c, memo main) => memo.c main.c

  • $(addprefix 접두어, 문자열) : $(addprefix src/, memo main) => src/memo src/main

  • $(shell ) : SH = $(shell ls *.c) => shell 명령에 대한 결과가 변수에 들어감

  • $(subst 찾을 문자, 변경할 문자, 대상 문자) : "대상문자"에서 "찾을 문자"를 "변경할 문자"로 변경해 준다.

  • $(patsubst 찾을 패턴, 변경할 패턴, 대상 문자) : subst와 기능은 동일하나 확장자를 바꿀때 사용함

  • $(strip 대상문자) : 대상문자에서 모든 공백을 1칸으로 줄인다. 여백이 많아도 모두 1칸으로

  • $(filter 찾을 문자, 대상문자) : 대상문자에서 찾을 문자를 포함한 문자들을 찾아서 저장한다.

  • $(filter-out 찾을 문자, 대상문자) : filter와 반대로 찾을 문자가 있는 경우를 제외하고 저장한다.

  • $(join 원본문자, 붙일문자) : 원본문자와 붙일문자를 붙여서 한 문자로 만든다.

  • $(dir 대상문자) : 대상문자에서 파일문자를 제외한 경로명만 추출한다.

  • $(notdir 대상문자) : 대상문자에서 파일명만 추출한다.

  • $(baseanme 대상문자) : 대상 문자에서 확장자를 제외한 문자를 알려준다.

📕 Francinette

1) 정의

42 프로젝트를 위한 testing framework

  • 프로젝트 폴더에 넣어 francinette / paco 실행
  • libft, ft_print, get_next_line, minitalk, pipex 테스트

2) 예시

3) francinette 설치

bash -c "$(curl -fsSL https://raw.github.com/xicodomingues/francinette/master/bin/install.sh)"

📕 norminette

1) 정의

  • 42 Seoul 코딩 스타일 규칙

2) 규칙

  • if, while 등 키워드 뒤에 한 칸 공백 삽입 후 괄호 작성
    • if (조건식)
      {
      }
    • while (조건식)
      {
      }
  • 사용할 수 없는 문법
    • for
    • switch
    • case
    • 중첩된 삼항연산자
    • 주석
  • 지역변수는 변수 선언과 초기화를 동시에 할 수 없음
    • 변수 선언하는 부분은 가장 위에 선언 (빈 줄x)
    • 변수 선언 부분과 대입문, 구현문은 빈 줄이 삽입되어야함
  • 변수명, 함수명 정렬
    • 한 함수 내의 변수명, 하나의 .c 파일 내의 함수명은 타입 뒤에 탭을 삽입하여 한 줄로 정렬
  • #ifndef 헤더파일
    • 일반 .c 파일에서는 #include 쓰지만, 헤더파일 작성 시 #ifndef, #endif 사이에 전처리기 ?#로 시작하는 모든 구문은 스페이스 한 칸 필요
    • #ifndef HEADER_H
      # define HEADER_H
    • # include <unistd.h>
      # define MIN(x, y) ((x < y) ? (x) : (y))
      # endif
  • break;
  • 사용하지 않는 헤더 작성x

3) norminette 설치

4) 42 Header 설치

📒 memory leak 확인 ( lldb debugging)

  1. 컴파일시 -g 옵션 : gcc -h *.c *.h
  2. 디버거 실행 : lldb a.out
  3. 프로그램 실행 : r or run
  4. breakpoint 걸기 : b 함수명/줄번호
  5. 다음 줄 실행 : n or next
  6. 함수 내부 실행 : s or step
  7. 변수 값 보기 : p 변수명 or print 변수명
  8. 종료 : exit
profile
Notion으로 이동 (https://24tngus.notion.site/3a6883f0f47041fe8045ef330a147da3?v=973a0b5ec78a4462bac8010e3b4cd5c0&pvs=4)

0개의 댓글