gcc 는 c언어로 코딩된 소스를 기계언어로 변환해준다
링커는 오브젝트 파일을 모아서 하나의 실행파일로 만들어준다
rm -rf *: -r 은 디렉토리 내의 파일을 모두 지우는 옵션. f는 묻지말고 무조건 실행
which gcc
sudo aptinstall build-essential
gcc --version
man gcc
gcc -v
확장자
.c C파일 gcc로 컴파일
.cpp C++파일 g++로 컴파일
gcc 옵션
-c 오브젝트 파일로 컴파일하고 링크는 안함, .c파일을 컴파일하고 .o파일을 만듬
-o 출력파일의 이름을 지정. 지정을 안하면 기본적으로 a.out으로 생성됨
-g 컴파일후 표준 디버깅 정보도 포함
gcc test.c를 하면,
a.out 이 생성됨.
./a.out 을 하면, test.c에서 코딩한 내용에 따라서 실행됨.
gcc로 test.c의 실행파일까지 만들었음을 보여줍니다.
또한 여러개의 c 파일로 프로그래밍을 한 경우
gcc test.c test1.c test2.c를 하면,
a.out이 생성됨
그러나, 소스파일 .c가 여러개인 경우에 하나의 파일만 수정하였는데 컴파일 할때, 코드 파일의 수가 많아서 컴파일하는데 시간이 오래걸리면, 수정된 것만 컴파일 하면 컴파일하는 시간을 단축시킬수 있을 것입니다.
즉, 이럴때 각 .c파일에 대하여 오브젝트 파일을 생성한 후,
링크를 하여,
1개의 실행파일을 만들어야 합니다. 그래서,
gcc -c test.c를 하여,
test.o를 생성되도록 하고,
gcc -o test test.o 를 하면,
test 가 생성됨
./test 를 하면, test.c에서 코딩한 내용에 따라서 실행됨.
main함수를 포함하는 test.c외에 test1.c test2.c에 있을 때는,
gcc -c test.c 를 하여, test.o가 생성되도록 하고,
gcc -c test1.c 를 하여, test1.o가 생성되도록 하고,
gcc -c test2.c 를 하여, test2.o가 생성되도록 한 후,
gcc -o test test.o test1.o test2.o를 하여, 하나의 test 실행파일을 만듭니다.
./test 를 하면, test.c test1.c test2.c로 프로그래밍하였던 결과가 출력됩니다.
이후, test.c를 수정한다면,
gcc -c test.c 과
gcc -o test test.o test1.o test2.o 만 실행하면 되기 때문에
컴파일하는 시간을 단축할수 있습니다.
그런데, 여러개의 .c파일을 각각 컴파일하여 오브젝트 파일로 만들어서 링크하여 하나의 실행파일로 만드는 것은 그 절차가 번거롭습니다. 즉, 컴파일해서 실행파일을 만드는데 실행한 과정은 어러번의 컴파일과정을 필요로하여 번거롭고 효율이 떨어집니다.
gcc -c test.c
gcc -c test1.c
gcc -c test2.c
gcc -o test test.o test1.o test2.o
이러한 과정을 쉽게 해주는 것이 Makefile과 make 입니다. 즉, Makefile에 컴파일, 링크, 실행파일 만드는 과정을 정리하여 저장해둔 후, make를 실행하면 하나의 실행파일이 생성되도록 하는 것입니다.
Makefile을 만들어보면,
vi Makefile 을 한 후, 내용을 입력하면,
all: test
test: test.o tset1.o test2.o
gcc -o test test.o test1.o test2.o (참고로 gcc앞의 띄어쓰기는 스페이스가 아닌 탭으로 함 )
test.o: test.c
gcc -c test.c
test1.o: test1.c
gcc -c test1.c
test2.o: test2.c
gcc -c test2.c
이와같이 작성하고 파일명을 Makefile (확장자없이) 저장한 후,
make 를 합니다.
이후, test.c를 수정한후 make를 하면, 자동으로
test.c만 컴파일하고 링크합니다.
만일, 수정된것 없이 make를 하면,
make: nothing to be done for mall이 출력됩니다.
즉, make를 필요한 파일만 컴파일을 하도록 되어있습니다.
Makefile을 범용적으로 하여 haetae라는 실행파일이 생성되도록 만들어보면
TARGET=haeate
OBJ=test.o test1.o test2.o
CC=gcc
CFLAGS=-c
LFLAGS=
all: $(TARGET)
$(TARGET): $(OBJ)
$(CC) -o $(TARGET) $(OBJ)
.c.o:
$(CC) $CFLAGS) $<
clean:
rm -rf $(TARGET) $(OBJ)
처럼 작성한 후 Makefile 파일명으로 저장합니다.
Makefile에도 위에서처럼 문법이 있으므로 참고하여 작성할 수 있습니다.
초보자가 알면 좋은 임베디드 리눅스 시스템 개발과정 조금 (0) | 2021.08.03 |
---|---|
라즈베리파이3에 우분투 설치 (1) | 2021.08.02 |
리눅스 임베디드 부트로더 (0) | 2021.08.02 |
리눅스 Vim 모드 코딩 (0) | 2021.07.31 |
리눅스에서 소스 컴파일 과 프로그램 설치 (0) | 2021.07.31 |
댓글 영역