열렬히.뛰기

c09

école 42 > C > c09

ex00

c 파일 → 오브젝트 파일 → 라이브러리

bash
gcc -c -Wall -Wextra -Werror ft_putchar.c ft_swap.c ft_putstr.c ft_strlen.c ft_strcmp.c 
ar rsc libft.a ft_putchar.o ft_putstr.o ft_strcmp.o ft_strlen.o ft_swap.o
  • gcc -c 옵션 → 오브젝트 파일 (.o 파일) 을 만들어준다.
  • ar rsc ~~.a ~~.o → 오브젝트 파일을 라이브러리로 만들어 준다.
  • ar = archieve라는 뜻.
  • RCS의 의미

c

아카이브 생성

r

 오브젝트 추가

s

인덱스 생성

라이브러리의 종류

  • 정적 라이브러리 : 정적 라이브러리는 프로그램이 실행될 때 프로그램에 포함되어 동작하는 라이브러리입니다. 컴파일 시에 라이브러리를 링크하는 방식으로 사용됩니다. 정적 라이브러리는 라이브러리를 링크할 때 라이브러리의 전체 코드가 프로그램에 복사되기 때문에, 프로그램 실행 시간에 라이브러리를 로드하는 비용이 들지 않습니다. 이는 실행 속도 측면에서 정적 라이브러리를 사용할 때 유리합니다. 하지만 라이브러리를 링크할 때마다 라이브러리의 전체 코드가 복사되기 때문에, 프로그램의 크기가 커지는 단점이 있습니다. 또한 라이브러리를 업데이트하려면 프로그램을 다시 컴파일해야 하므로 유연성 측면에서는 동적 라이브러리를 사용하는 것이 유리합니다.
  • 동적 라이브러리 : 동적 라이브러리는 프로그램 실행 중에 필요할 때 메모리에 로딩되는 라이브러리로, 정적 라이브러리와 달리 따로 컴파일하여 만들지 않아도 된다. 동적 라이브러리는 실행 파일의 크기가 작아지고, 라이브러리의 업데이트가 쉽다는 장점이 있다. 또한 여러 프로그램에서 공유하여 사용할 수 있다는 이점이 있다.하지만 동적 라이브러리에는 실행 속도가 느려질 수 있고, 라이브러리 파일을 찾는 시간이 추가될 수 있다는 단점이 있다.
  • 여기서는 정적 라이브러리를 만든다.

ex01

makefile

  • makefile을 사용함으로써 개발자들은 프로젝트의 각 파일을 수동으로 컴파일하는 귀찮은 작업을 피하고 대신 자동 빌드 시스템이 필요한 파일만 컴파일하도록 의존할 수 있습니다.
  • makefile은 특히 C 및 C++ 프로젝트에서 많은 소스 코드 파일을 컴파일하고 연결해야하는 경우에 유용합니다. 또한 다른 프로그래밍 언어와 프로젝트 유형에도 사용할 수 있습니다.
  • 요약하면, makefile은 소프트웨어 개발에 필수적인 도구로 빌드 프로세스를 간소화하고 결과물 소프트웨어의 신뢰성과 일관성을 보장하는 데 도움이 되는 도구입니다.

Makefile 작성 방법:

Makefile은 텍스트 파일로 작성되며, 소스 파일과 관련된 빌드 명령을 포함합니다. Makefile의 구문은 다음과 같습니다.

target: dependencies
    command

  • target: 빌드하려는 파일의 이름입니다.
  • dependencies: target을 생성하는 데 필요한 파일의 목록입니다.
  • command: target을 생성하는 데 필요한 명령입니다.

예를 들어, 다음은 "hello"라는 실행 파일을 만드는 Makefile의 예입니다.

hello: main.c hello.c
    gcc -o hello main.c hello.c

위 Makefile은 "hello"라는 실행 파일을 만들기 위해 main.c와 hello.c 파일이 필요하며, gcc 명령어를 사용하여 빌드합니다. Makefile에서는 변수를 사용할 수도 있습니다. 변수는 $ 기호와 함께 사용됩니다. 예를 들어, 다음은 CFLAGS 변수를 사용하여 컴파일러 플래그를 지정하는 Makefile의 예입니다.

CFLAGS=-Wall -Wextra -Werror

hello: main.c hello.c
    gcc $(CFLAGS) -o hello main.c hello.c

위 Makefile에서, CFLAGS 변수는 컴파일러 플래그를 지정합니다. Makefile에서는 또한 함수와 조건문을 사용할 수 있습니다.

Makefile은 프로젝트를 관리하는 데 유용한 도구입니다. 프로젝트의 여러 파일을 관리하고 빌드하기 위해 Makefile을 작성할 수 있습니다. Makefile을 사용하면 소스 코드 파일이 수정될 때마다 빌드를 수행하고 업데이트된 실행 파일을 생성할 수 있습니다. 또한 Makefile을 사용하면 다양한 플랫폼에서 빌드를 수행할 수 있습니다. Makefile은 유지보수와 이식성을 향상시키는 데 큰 도움이 됩니다.


문제 뚫기

makefile
NAME = libft.a
HEADER = ./includes/ft.h
CFLAGS = -I $(HEADER) -Wall -Wextra -Werror 
SRCS	= srcs/ft_putchar.c \
		srcs/ft_swap.c \
		srcs/ft_putstr.c \
		srcs/ft_strlen.c \
		srcs/ft_strcmp.c
OBJS	= $(SRCS:.c=.o)

all	: $(NAME)

$(NAME): $(OBJS)
	ar -rcs libft.a $(OBJS)

%.o: %.c
	cc $(CFLAGS) -c $<
	mv $(notdir $(<:.c=.o)) ./srcs

clean:
	rm -rf $(OBJS)

fclean : clean
	rm -rf $(NAME)

re: fclean all

실행 방법 : make + 명령어

make all : 모든 것을 만듬. make로 해도 됨.

  • all → lifbt.a → .a가 없으니 → .o 불러옴 → .o가 없으니 만든다.
  • $(SRCS:.c=.o) : SRCS 안에서 .c으로 끝나는 부분을 모두 .o로.
  • 그런데, xyz.o가 없으니 xyz.cxyz.o를 만든다.

즉 이곳%.o: %.c 이 바로 핵심 파트.

  • % 의 의미 : wildcard. 하나하나 불러온다.

우선 작성 전, 자동변수에 대해 알아보자.

  • $^ : 자동변수의 일종. 현재 target이 의존하는 대상(c 파일)들의 전체 목록
  • $@ : 자동변수의 일종. 현재 target의 이름.
  • $< : 자동변수의 일종. 의존 파일 목록에 첫 번째 파일에 대응

이외 clean 파트

-rf

  • -f : 강제로 파일이나 디렉토리 삭제. 삭제 대상이 없으면 메시지 출력 안함.

ex02

ft_split.c. 이전 내용과 동일.