ex00
c 파일 → 오브젝트 파일 → 라이브러리
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은 유지보수와 이식성을 향상시키는 데 큰 도움이 됩니다.
문제 뚫기
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.c로xyz.o를 만든다.
즉 이곳%.o: %.c 이 바로 핵심 파트.
%의 의미 : wildcard. 하나하나 불러온다.
우선 작성 전, 자동변수에 대해 알아보자.
$^: 자동변수의 일종. 현재 target이 의존하는 대상(c 파일)들의 전체 목록$@: 자동변수의 일종. 현재 target의 이름.$<: 자동변수의 일종. 의존 파일 목록에 첫 번째 파일에 대응
이외 clean 파트
-rf
- -f : 강제로 파일이나 디렉토리 삭제. 삭제 대상이 없으면 메시지 출력 안함.
ex02
ft_split.c. 이전 내용과 동일.