201303/함수의 분리와 링크. 리눅스에서 make 사용

2013. 4. 3. 17:04프로그래밍/C언어 TIP

 함수의 분리와 링크 
지난번에 만들었던 함수를 이용하여 OBJ파일만을 이용하여 링크 하는 과정을 알아본다. 


어제 hi()라는 함수를 생성하여 main()안에서 어떻게 사용하는지를 확인했다. 오늘은 분리 되어진 함수를 서로 합치는 방법에 대해서 알아본다. 원본 파일을 유지하기 위해 현재 위치에서 폴더 하나를 더 생성한다. 

20110420test 폴더가 생성 되어진 모습을 볼 수 있다. 이 폴더 안에 어제 만든 0419.c파일을 복사해 넣어준다. 

여기서 0419.c 파일을 cp명령어를 이용해 main.c로 하나 더 만들어 준다. 그리고 0419.c를
mv명령어를 통해 hi.c로 바꿔준다. 아래 그림을 참조 

cp명령어는 기존의 파일을 원하는 이름으로 하나 더 복사하는 명령어이지만, mv명령어는 기존의 파일을 삭제시키고 원하는 파일 이름으로 복사하는 명령어이다.

 main.c는 정의된 함수부분을 삭제 시켜준다. 

 

hi.c는 hi()함수의 원형과 main()부분을 삭제 시켜준다. 



이런 상태에서 main.c와 hi.c를 컴파일 해본다. 
 


실행파일(EXE)을 정의되어 있지 않은 함수 때문에 Error가 발생하지만 gcc -c로 OBJ파일을 생성하면 error없이 파일을 생성된다. 그것으로 컴파일 할때 프로그램 내에 문법적 오류만 없으면 오브젝트(OBJ)까지 파일이 생성된다는 것을 알 수 있다.

컴파일 5단계를 통해 오브젝트의 생성까지를 확인해보자.  


문법적 오류가 없는 경우 어셈블리 과정까지는 이상없이 실행된다는 걸 알 수 있다. 
gas(가스)와 collet2는 컴파일시 gcc에서 각 단계를 처리하기 위해 보내지는 프로그램이다.

그럼 cl명령에서는 어떠한 오류가 뜨는지 확인해보자. 

unresolved external symbol에러는 실행파일을 만들때는 실행에 필요한 모든 오브젝트와 라이브러리를 연결하여 실행파일을 만들어야 하는데 링크 과정에서 _hi() 함수가 실제 구현되어 있는 곳이 없어서 발생하는 에러이다. cl명령에서도 obj파일까지는 이상없이 생성된다는 걸 알 수 있다. 다음 명령어를 쳐보자  


.obj파일이 gcc에서와 마찬가지로 cl컴파일에서도 모두 생성되 있는 모습을 볼 수 있다.

오류 창으로 다시 넘어가 오류 부분에서 가장 상단에 위치한

는 
cl로 컴파일할 때 생략되는 명령어와 실행 파일 이름이다. gcc처럼 이름을 지정해 주고 
싶다면 아래와 같이 입력하면 된다. 

 

 
이제 분리되어진 두 파일을 obj파일로 다시 링크시켜보자. 
방법은 간단하다. gcc –c main.c와 gcc –c hi.c로 만들어진 .o파일을 이용하면 된다. 

 



비슷한 방법으로 cl로도 링크가 가능하다. 
 


결과는 직접 확인해보자.

  

 리눅스에서 make사용방법 
make란? 
여러 파일로 구성된 프로그램이 있을 경우 하나의 소스파일을 수정하면 모든 파일을 다시 컴파일하고 링크해야 한다. 결국 이러한 수고를 편하게 하기 위해서 수정된 파일만 자동으로 알아내 컴파일 하고 수정하지 않은 파일에 대해서는 기존오브젝트 파일을 그대로 이용하게 해주는 툴이다.

매크로 : makefile을 작성하다 보면 파일이름을 여러 번 써야 하는 경우가 있다. 이런 경우에 매크로를 사용하면 편리하고 명령을 단순화시킬 수 있다.

매크로 사용시 대소문자 모두 가능(보통 대문자로 쓴다)하며 makefile 상단에 정의한다.

 내부 매크로 설명

$@ : 현재 목표 파일의 이름 
$* : 확장자를 제외한 현재 목표파일의 이름 
$< : 현재 필수 조건 파일 중 첫번째 파일 이름 
$? : 현재 대상보다 최근에 변경된 필수 조건 파일 이름 
$^ : 현재 모든 필수 조건 파일들  

더욱 자세한 내용은 인터넷을 통해 습득하기 하길.. 

make 사용하기 
먼저 make를 쓰기 위해서는 makefile이 필요하다. makefile은 다음과 같이 작성한다. 


모든 makefile이 똑같지 않다. 상황에 맞게 수정하여 쓰면 된다. 일단 makefile이 있어야 make 명령어를 쓸 수 있다.

리눅스 창에서 make를 입력해보자. 


이런 화면이 뜨게 되면 성공적으로 링크가 이루어 진 것이다. 

화면에서 run을 쳐보자. 

서로 분리되어 있는 파일이 make명령으로 링크가 쉽게 이루어 지는 것을 확인할 수 있다.