간단한 gcc 사용법

2018. 4. 17. 03:13Programming/C/C++

지난 달부터 리눅스로 프로그래밍을 하고 있는데, 처음에 제대로 된 gcc 사용법을 몰라서 고생했습니다.


제가 필요할 거 같아서 일단 여기에 적어놓습니다.


$ gcc main.c

기초적인 사용법은 위와 같습니다. 컴파일 하고 싶은 C 파일을 적으면 결과물로 a.out이라는 바이너리 실행 파일이 나옵니다.


해당 파일을 실행하기 위해서는 ./a.out 이라고 입력하면 됩니다.


실행파일의 이름을 정해주고 싶을 땐 -o 옵션을 사용하면 됩니다.


$ gcc -o main main.c 

이렇게 하면 a.out이 아니라 main이란 이름으로 파일이 생성됩니다.



컴파일 과정은 c 파일에서 바로 바이너리로 가는 것이 아니라, 먼저 object 파일로 변환하고 링크라는 과정을 통해 최종적으로 실행가능한 컴파일 과정을 거칩니다. c 파일 하나만 컴파일하는 경우엔 별로 중요하진 않지만, 여러 파일을 한꺼번에 링크할 경우에는 필요한 옵션이죠.


$ gcc -c -o main.o main.c
$ gcc -c -o array.o array.c

이렇게 하면 main.o와 array.o를 생성할 수 있습니다.


-o 옵션으로 출력된 오브젝트 파일들을 링킹할 땐 크게 다르지 않습니다.


$ gcc -o main main.o array.o

만일 오브젝트 파일을 만들어주는 과정이 번거롭다면 c파일에서 바로 링킹에서 컴파일까지 진행할 수도 있습니다.


$ gcc -o main main.c array.c

이 경우엔 .o 파일을 남기지 않습니다.


컴파일할 때 보통 #inlcude <math.h> 같은 인클루드문을 맨 위에 적습니다만, gcc에서 컴파일할 땐 사용하고자 하는 라이브러리를 옵션에 명시하는 것이 좋습니다.


-l(소문자 L) 옵션을 사용하며, 띄어쓰기 없이 옵션 뒤에 바로 라이브러리 이름을 적습니다.


$ gcc -o main main.c -lm

-lm은 math.h를 참조하겠다는 의미입니다. 이 외에도 -lpthread 같은 옵션이 가능합니다.


주의하실 점은, 어째서인진 몰라도 -lm의 위치는 가장 뒤에 있는 게 좋다는 것입니다. 분명히 같은 옵션인데 -lm을 앞에 넣으면 컴파일이 안되는 현상이 있더군요.


이하는 자주 사용할만한 parameter 모음입니다.


$ gcc -v -I/usr/local/include -DDEBUG -Wall -W -O2 -L/usr/local/lib -o like like.c -lm


-v : 컴파일 과정을 화면에 출력합니다.

-o : 출력 파일 이름 설정

-I : 대문자 i입니다. header 파일의 위치를 설정합니다

-D : 코드 내부 define입니다. 맨 위에 #define을 추가하는 것과 같습니다.

-Wall : Warning all입니다. 컴파일은 진행되지만, gcc가 알려주는 warning들을 보여줍니다.

-W : Wall 옵션으로 미처 표시되지 않던 나머지 warning도 함께 보여줍니다.

-On : 최적화 옵션이라고 하는데, 저도 잘 모릅니다. -O3, -Os 같은 식으로 사용합니다.

-lm : math libarary 사용하는 옵션입니다.

-L : library 폴더의 위치를 지정합니다.

-c : *.o 파일을 생성하는 옵션입니다.


다음엔 간단히 Makefile 만드는 법에 대해서 쓰겠습니다.