Programming

gcc Make Makefile 매크로 CMake CMakeLists.txt

신농해태 2022. 6. 15. 06:50
반응형

gcc Make Makefile 매크로 CMake CMakeLists.txt

 

A.h B.h A.c B.c main.c

1. Make를 사용하지 않을 경우:
컴파일 : 소스코드 -> 어셈블리어, 소스파일.c을 목적파일.o로 변환
링킹 : 서로 다른 파일에 있는 소스코드를 하나로 묶어서 하나의 실행파일로 만듬
(A.c B.c main.c) -> 컴파일 -> (A.o B.o main.o) -> 링킹 -> test.out

gcc -c main.c
gcc -c A.c
gcc -c B.c
gcc -o test.out main.o A.o B.o
-> 파일 많이지면 여러번 gcc 실행해야함


2. Make의 필요성
쉘 스크립트에 필요한 모든 명령어를 넣고 실행 가능
한 파일만 컴파일해도 되도록 함
make를 통해 필요한 파일만 빠르고 효율적으로 컴파일 가능
<Target>: <Dependencies>
Tab <Command>
Target : 빌드 후 최종 결과로 저장되는 파일
Dependencies : make할 때 필요한 파일 목록
Command : 실행하려는 명령어
: Dependencies를 모아서 Command를 실행하여 Target를 만듬

ex)
test.out: main.o A.o B.o
   gcc -o test.out main.o A.o B.o
main.o: A.h B.h main.c
   gcc -c main.c
A.o: A.h A.c
   gcc -c A.c
B.o: B.h B.c
   gcc -c B.c


3. Makefile-매크로
$(매크로)
CC=<컴파일러>
TARGET=<빌드 대상 이름>
OBJS=<Objec 파일 목록>

CC=gcc
TARGET=test.out
OBJS=main.o A.o B.o

ex)
CC=gcc
TARGET=test.out
OBJS=main.o A.o B.o

$(TARGET): $(OBJS)
   $(CC) -o $(TARGET) $(OBJS)

main.o: A.h B.h main.c
   $(CC) -c main.c

A.o: A.h A.c
   $(CC) -c A.c

B.o: B.h B.c
   $(CC) -c B.c

내부 매크로
$@ : 현재 Target 이름
$^ : 현재 Target이 의존하는 대상들의 전체 목록(objs)
$? : 현재 Target보다 최신인 의존파일 참조
$< : 의존 파일 목록 중 첫 번째 파일 참조
확장자 규칙
.c.o : .c소스파일을 컴파일해서 .o목적파일로 만듬
all: $(TARGET)  - 최종으로 만들 파일
clean:  현재 디렉토리의 모든 object 파일을 제거함
정해져 있는 매크로
CFLAGS : 컴파일 옵션 -g (디버그 정보 표시)
LDFLAGS: ld 옵션
LDLIBS:  링크 라이브러리
ex)
CC=gcc
TARGET=test.out
OBJS=main.o A.o B.o
CFLAGS= -g

all: $(TARGET)

$(TARGET): $(OBJS)
   $(CC) -o $@ $^

.c.o:
   $(CC) -c -o $@ $<

clean:
   rm *.o 

1. GCC 컴파일러 이용
2. 타켓 파일은 test.out
3. OBJS를 main.o A.o B.o로 정의
4. 디버그 정보 표시
5. 최종으로 생성할 파일 명시
6. 타겟 파일을 만들기 위해 OBJS 사용하여 다음 명령 실행
7. .c파일을 목적파일로 컴파일
8. 필요시 clean 명령 사용

Make 옵션
-h : 옵션에 관한 도움말 출력
-p : make 내부에 세팅되어 있는 값 출력
-k : 에러가 나도 계속 실행
-t : 파일의 생성날짜를 현재 시간으로 갱신
-f file : file에 해당하는 파일을 Makefile로 취급
-r : 내장된 규칙을 없는 것으로 간주, 사용자 정의 규칙 필요
-d : Makefile을 수행하면서 모든 정보 출력


4. CMake
Make의 빌드관리 시스템을 만들기 위한 오픈소스 프로젝트
Makefile 자동 생성 및 관리
지정한 운영체제에 맞는 Makefile을 생성해서 소스코드 빌드 편리
의존성 정보를 일일이 기술해주지 않아도 되므로 빌드 스크립트 관리 효율적
cmake.org/download
( CMakeLists.txt ) -> cmake -> ( Makefile ) -> make -> (실행파일.out)
1) CMakeLists.txt 파일 작성 
  ADD_EXECUTABLE(test.out A.c B.c main.c)    : .h 파일은 자동 인식
2) cmake CMakeLists.txt
   Makefile
   CMakeCache.txt
   cmake_install.cmake
   CMakeFiles(디렉토리)   : A.o B.o main.o 파일이 생성되어 저장됨
3) make 를 실행하면 test.out이 생성됨
4) 만들어진 test.out 실행파일을 실행시킬 수 있음
* cmake 명령은 소스파일을 추가하지 않는 이상 최초로 한번만 실행
소스파일이 수정됐을 경우 make명령으로 빌드만 하면 됨
ex) A.c만 수정했으면 make만 실행하여 test.out를 만들면 됨

* CMakeLists.txt 작성
PROJECT ( 
DESCRIPTION "FOSS"
LANGUAGES C
)

CMAKE_MINIMUM_REQUIRED(VERSION <버전>) : 빌드에 필요한 cmake 최소 버전

SET(<변수이름><값>
SET(<목록변수이름><항목><항목>...) 
ex) SET(SRC_FILES main.c A.c B.c)

ADD_COMPILE_OPTIONS(옵션1, 옵션2 ...) : 소스파일 컴파일시 추가할 옵션
ex) ADD_COMPILE_OPTIONS(-g -Wall)

ADD_EXECUTABLE(<실행 파일 이름><소스파일>...) : 빌드 최종 결과물 생성
ex) ADD_EXECUTABLE(test.out main.c A.c B.c)
ex) ADD_EXECUTABLE(test.out ${SRC_FILES})

CMAKE_C_COMPILER : 컴파일 및 링크 과정에서 사용할 컴파일러의 경로 지정
ex) SET(CMAKE_C_COMPILER "gcc")

CMAKE_MINIMUM_REQUIRED(VERSION 3.11)

PROJECT (
DESCRIPTION "FOSS"
LANGUAGES C
)

SET ( SRC_FILES
main.c
A.c
B.c
)
SET ( CMAKE_C_COMPILER "gcc" )

ADD_COMPILE_OPTIONS ( -g -Wall)

ADD_EXECUTABLE(test_out A.c B.c main.c)

MESSAGE( ) : 콘솔에 메세지 출력
ADD_LIBRARY(<라이브러리 이름>[STATIC|SHARED|MODULE]<소스파일>)  최종결과물로 라이브러리생성
INSTALL() : make install 실행시 할 동작 지정
INCLUDE_DIRECTORIES(디렉토리1, 디렉토리2, ...) : 헤더 디렉토리 목록 추가
SET ( RUNTIME_OUTPUT_DIRECTORY 디렉토리1) : 빌드된 실행바이너리를 저장할 디렉토리 지정

 

gcc Make Makefile 매크로 CMake CMakeLists.txt

728x90
LIST