프로그래밍/리눅스

gcc / g++ 사용법과 설명

Hwan2 2020. 5. 17. 20:05
반응형

1. 소개.







GNU 프로젝트에 의해 개발되었으며, 현제는 여러 언어를 컴파일하는 컴파일러입니다.



여기서!!

컴파일 : 고급언어(C, C++, JAVA, etc...)를 컴퓨터가 알아먹을 수 있도록 하는 일련의 과정을 뜻함.

컴파일러 : 고급언어(C, C++, JAVA, etc..)를 기계어(어셈블리어)로 바꿔주는 프로그램을 뜻함.




리눅스에 "test.c" 라는 C 파일이 있고 이를 GCC로 컴파일해보겠습니다.



이런식으로 진행이 됩니다.



그럼 전처리가 진행되는 부분부터 살펴보도록 하겠습니다.


gcc와 g++ 사용법과 다른것은 그냥... C언어면 gcc 사용하면되고 C++파일이면 g++로 사용심 됩니다.



2. 전처리



전처리란??


#include, #define, typedef, extern 과 같은 것들이 정의되어 실행되는 단계로 방대한 양의 소스코드가 

정의한 코드 위에 붙는걸 확인할 수 있습니다.

(stdio.h 속에 있는 모든 코드들이 main함수 위에 등록된다고 보시면 됩니다.)






test.c 파일은 C언어로 작성된 프로그래밍 언어 파일입니다. 고급언어죠.

#include<stdio.h>

int main(){
    printf("hello\n");

    return 0;
}



test.c는 이런식으로 되어 있습니다.  


간단하죠??


저 파일을 test.i로 바꿔보겠습니다.



명령어


$ gcc -E test.c -o test.i



 -E 

 전처리기 과정을 화면에 출력  

 -o

 결과를 담을 파일 지정 



결과




729번 줄을 보면 main함수가 나옵니다.

즉, 1 ~ 728번줄 까지 <stdio.h>의 소스 코드가 붙여진걸 확인할 수 있습니다.






3. 컴파일러


컴파일러??


전처리된 파일을 어셈블리어로 바꿔주는 역할을 하는 프로그램입니다.





실행하는 명령어는 다음과 같습니다.




명령어.


$ gcc -S test.i -o [생성할 파일 이름]


or


$ gcc -S test.i



 -S 

 코드를 어셈블리어로 번역 

 -o

 결과를 담을 파일 지정 







어셈블리어로 번역된 코드를 보면 44줄밖에 되질 않습니다.


전처리했을땐 750줄 가까히 됬는데 말이죠.


이 이유는 컴파일러가 어셈블리로 만드는 과정에서 실제로 호출되고 사용되는 부분만 번역하기 때문입니다.











5. 어셈블러


어셈블러??


어셈블러는 어셈블리어 코드를 기계어로 바꿔주는 역할을 합니다.

보통 이렇게 변환된 파일을 오브젝트 코드 라고 하며, 리눅스는 .o, 윈도우는 .obj로 

확장자를 다르게 사용합니다.









명령어.


$ gcc -c test1.s


or


$ gcc -c test1.s -o [만들 파일 이름]



 -c

 코드를 기계어 코드로 번역(오브젝트 파일)

 -o

 결과를 담을 파일 지정 



해당 기계어는 프로그래머가 볼 수 없습니다.


하지만 디스어셈블로 기계어를 어셈블리어로 되돌린다면 내용을 확인할 수 있습니다.








6. 링커


링커???


만들어진 오프젝트 코드 파일들을 하나로 묶어 실행파일로 만듭니다.




명령어.


$ gcc -g test.o     -> a.out 실행파일 생성(자동으로)


or


$ gcc -g test.o -o [만들 파일 이름]    -> 사용자가 지정한 이름의 실행파일 생성




 -g

 오브젝트 코드를 실행 파일로 만듬

 -o

 결과를 담을 파일 지정 






실행 결과.






개인적으로 너무 귀찮고 하기 너무 싫은 글이었습니다.


makefile 더하기 싫다 ㅡㅡ






반응형