• Make를 쓰는 이유

 - 각 파일에 대한 반복적 명령의 자동화로 인한 시간 절약

 - 프로그램의 종속 구조를 빠르게 파악 할 수 있으며 관리가 용이

 - 단순 반복 작업 및 재작성을 최소화


  • Makefile의 구성

 - 목적파일(Target) : 명령어가 수행되어 나온 결과를 저장할 파일 

 - 의존성(Dependency) : 목적파일을 만들기 위해 필요한 재료

 - 명령어(Command) : 실행 되어야 할 명령어들

 - 매크로(macro) : 코드를 단순화 시키기 위한 방법


  •  Makefile 만드는 이유

 - 하나의 실행파일을 생성하는데 필요한 c파일이 여러 개인 경우 그만큼의 명령어가 필요하다. 이러한 상황을 해결해 주기 위해 makefile

 을 사용한다.





문제 13) 문제 12와 동일한 mainAlg 실파일이 만들어 질 수 있도록 make 유틸리티를 실행할 수 있는 Makefile 파일의 내용을 쓰세요.


1. Makefile을 만들기 위해 printMain.c 와 printmsg.c 파일을 만든다.




1) ‘printMain’와 ‘printmsg’ 파일 2개를 생성한다.

위의 사진은 ls의 명령어를 통해 파일이 생성되었는지 확인하는 장면이다.


 (1) 각 object 파일을 생성한다.

 gcc -c -o printMain.o printMain.c

 gcc -c -o printmsg.o printmsg.c


 이때, 

 -c 옵션 : object 파일을 생성

 -o 옵션 : 생성 될 파일 이름을 지정


 각 object 파일을 묶어 실행파일 생성한다.

 gcc -o mainAlg printMain.c printmsg.c


 실행 후 출력한다.

 ./mainAlg


2. Makefile을 생성


 1) Makefile 생성 방법




 

 2) 생성

  mainAlg : printMain.o printmsg.o

               gcc -o mainAlg printMain.o printmsg.o

  printMain.o : printMain.c

                   gcc -c -o printMain.o printMain.c

  printmsg.o : printmsg.c

                  gcc -c -o printmsg.o printmsg.c

  clean :

           rm *.o mainAlg 

  



3. 실행화면




 


 

느낀점 : Make를 사용하면 어떤 장점이 있는지 알지 못하고 무작정 외우기만 했다. 여러 번 힘들게 명령어를 작성하여 실행하는 과정을 make를 사용하면 간편하게 처리할 수 있다는 장점이 있다. 이러한 장점을 적용할 수 있었던 계기가 됬다.

  • 코드

 

위의 코드를 작성했더니아래와 같은 경고와 오류가 발생했다.

 


  • 오류경고

 


WARNING : format '%d' expects argument of type 'int', but argument type int 2 has type '__off_t {aka long int}' [-Wformat=]

Warning의 이유는 지난번과 같이 메모리가 깨지는 것으로 casting 할 필요성이 있다.


참고)  http://sojeong2.tistory.com/5?category=719060



ERROR : 'struct stat' has no member named 'st_fstype' printf("File system: %s \n", finfo.st_fstype);

그렇다면 에러를 확인해보자! 

확인해보니 struct에 st_fstype이 지원하지 않는다는 오류 메시지였다.

이에 마지막줄은 제거하고 (long long)을 통해 casting 해주었다.

 

또한 추가해서,

1.     #include <Stdlib.h> : C언어의 표준 라이브러리로문자열 변환의사 난수 생성동적 메모리 관리 등의 함수들을 포함하고 있다.

2.     #include <time.h> : C언어의 표준 라이브러리로시간과 날짜를 얻거나 조작하는 함수들을 포함하고 있다.

을 작성했다.

 


  • 오류 정리 후실행되는 모습

 

 

느낀점 : 윈도우보다 리눅스에 관한 정보들이 열악하여 찾기는 쉽지 않았다그러나 리눅스 또한 조금씩 익숙해져 가는 것 같다. Putty 또한 지금은 손 쉽게 이용하고 있다.

  • 코드



  • 코드 분석


Test.txt를 생성하여 초접근 권한을 0755로 설정하였다. 그러나 19행의 제한으로 인해 실제로는 0400이 설정된다.

이후 파일을 닫고 test.txt 파일에 대해서 쓰기 작업(W_OK)을 할 수 있는지 검사한다.

접근 권한을 0644로 변경하고 *소프트 링크를 생성한다.

31행에서 생성된 소프트 링크 파일의 실제 내용을 읽어서 표준 출력한다.

이러한 정보는 구조체 변수 FINFO저장한 후 출력한다.


*소프트 링크(심볼릭 링크) : 기호화 된 링크는 절대 경로 또는 상대 경로의 형태로 된 다른 파일이나 디렉터리에 대한 참조를 포함하고 있는 특별한 종류의 파일이다.





이 때, 경고 창 2개가 뜬다.


 - format '%d' expects argument or type 'int', but argument 2 has type '__off_t {aka long int}' [-Wformat=]

 - format '%d' expects argument of type 'int', but argument 2 has type '__blkcnt_t {aka long int}' [-Wformat=]


그러나 경고를 무시하고 실행해도 출력 할 수 있다.




하지만 경고가 궁굼하다면 경고의 메시지를 검색해보자!


경고 설명 :

%d는 정수형 출력해 주는 형식문자 이지만, strlen()라는 함수의 반환형은 매크로 자료형이다. 따라서 서로 자료형이 맞지 않다는 경고창을 주는 것이라고 나와있다.


해결 :

1) %d → %s로 변경해보겠다. (실패)

전혀…… 경고가 없어지지 않았다.


다시 한번 경고를 확인해보니 int형의 메모리는 4바이트로, long은 8바이트이다. 이 때, int형 자리에 long의 반환형 값이 들어가게 되면 format이 깨진다는 메시지이다.


2) 이를 해결하기 위해서는 %zu 또는 %ld를 통해 casting해주어야 한다. 코드를 경고 창이 뜨는 줄에 %d → $zu로 변경하니, 아래와 같이 경고 창이 없어졌다.

 


느낀점 : 굳이 큰 메모리를 사용할 필요가 없음에 우리는 간편하고 쉽게 자료형을 변환했다. 그러나 이번 기회를 통해 자료형 변환 과정에 있어서 메모리가 손상될 수 있다는 사실을 알 수 있었다. 메모리를 간과할 수 있는 프로그램은 없다고 생각한다. 다시 한번 메모리에 대해 생각해보게 된 계기가 된 것 같다.

+ Recent posts