3. make file 숙제(recursive, macro사용) 해보기. 각각의 함수를 .h를 이용해 .c 로 저장해보기

.

참고자료(http://forum.falinux.com/zbxe/index.php?document_srl=405822&mid=gcc)

Gcc 컴파일 과정, 라이브러리 생성, Makefile 기초

Gcc 옵션 정복

Makefile 문법 쉽게 설명하기


Maekfile 다중 C 프로그래밍




일단 make file을 만들기 전에 

2.번의 2와 1500 사이 소수를 출력하는 코드를 만들어야겠다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
 
int main()
{
    int i,j;
    FILE *fp=fopen("prime.txt""wt"); //*fp에서 prime.txt 만들고 옵션 wt
 
    printf("2와 1500사이에 있는 모든 소수\n");
    
    for(i=2; i<=1500; i++) {
        for(j=2; j<=i; j++) {
            if(i%j == 0) { //i의 값을 j로 나눈값이 0일경우 반복문 out.
                break;
            }
        }
 
        if(i==j) { //큰 for문 안에 있음. 소수출력 ,예를들어 i=4, j=2일때 첫 if문의 조건은  
                   //맞지만 i==j가 아니기 때문에 2가 소수이긴 하나 중복이 되지않는다.
            printf("%d \n", i);
            fprintf(fp, "%d \n", i);//i 값을 저장
        }
    }
 
    printf("\n");
    
 
    fclose(fp); // 꼭 닫아준다.
    
    printf("성공적으로 저장되었습니다 \n");
 
    for(;;);  // 비쥬얼에서 확인 위해 for(;;); 로 고쳤다.
}
 


이렇게 출력 성공! (나중에 \n 넣어서 다 한 행씩 표시되게 해놨다)


이렇게 prime.txt 파일도 출력했다.



이제 두번째 코드를 만드는게 문제다.

2개 자연수 받는 Input()함수는 

                                  

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 2 number input
// transfer and calculate area of triangle
 
#include <stdio.h>
 
int Input()
{
        int a, b;
        printf("write 2 numbers to input\n");
        scanf("%d %d", &a, &b);
 
        return a, b;
}
 

 

원래 input 하나짜리 함수는 해봤는데 두개 받아서 내보내는건 어떻게 하는거지...

이거이려나... 아마 main문 시작하자마자 Input() 쓰면 나오겠지..?




이제부터가 진짜 시작이다. 

각각의 input.c, area.c로 함수들을 저장해서 전체가 똑같이 돌아가도록 하는 것.

이를 위해서는 .h 헤더파일의 선언이 있어야 한다.


참고로 "input.h"는 절대경로다. <stdio.h>는 상대경로이고. 왼쪽처럼 헤더파일 폴더에 새로만들기를 하여 .h 파일을 만들면 된다. 대부분 헤더파일 이름은 주요한 함수들의 이름을 따라간다.


아래 코드는 메인함수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "input.h"
 
int main()
{
    int x=0, y=0; 
    float result=0;
    
    Input(&x, &y); //x,y 주소값->*a, *b의 실제 가리키는 값 = x, y
    result = Cal_area(x,y);
 
    printf("삼각형의 넓이는 %.3f", result);
    return 0;
}
 
 



아래코드는 input 전용 함수와 계산함수.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "input.h"
 
int Input(int *a, int *b) // 리턴값 int 있음.
{
    while(1){
        printf("2개 자연수 \n");
        scanf("%d %d", a, b); // *a, *b가 아닌 a, b에 scanf 값 받음.
 
        if(*a>0 && *b>0){
            printf("입력한 자연수는 %d, %d입니다\n", *a, *b);
            break;
        }
        else{
            printf("자연수만 입력하세요");
        break;
        }
    }
    return 0;
}
 
float Cal_area(int a, int b)
{
    return (float)a * (float)b / 2;
}
 



아래코드는 헤더파일 코드다.

1
2
3
4
5
#include <stdio.h>
 
int Input(int *a, int *b);
float Cal_area(int a, int b);
 






이렇게 C파트는 마무리 되고.

다음은 Makefile에 대한 공부다.


먼저 맨위를 보면 http://forum.falinux.com/zbxe/index.php?document_srl=405822&mid=gcc

위 같은 참고자료를 줬는데. 이게 아래의 모든 질문에 답해준다.


1.구조 란?

2. Macro 란?

3. gcc 개념

4. Makefile 어떻게 만드나

5. 종속적 recursive Makefile 만들기


1.

 Makefile 의 구조는 아래와 같습니다.

목표: 아래 명령을 실행하게 되는 모든 조건에 해당되는 파일 목록
    실행 명령어

위와 같이 구조가 되어있다는 것을 명심하고.


2.


$@목표 이름
$*목표 이름에서 확장자가 없는 이름
$<

조건 파일 중 첫번째 파일

$?목표 파일 보다 더 최근에 갱신된 파일 이름


3.

gcc -c main.c :  main.c 를 컴파일해서 main.o를 생성합니다.

gcc -0 hello hello.c : hello.c 를 컴파일해서 hello.o를 생성합니다.


4.

vi Makefile


5. 종속적 Makefile 만들기

http://wndrlf2003.blog.me/70176733234




최종 완료 후 make 실행.

이런 화면이 보인다.


디렉토리 c아래 a에서 저렇게 초록색 실행파일이 생겼다.

디렉토리 c아래 b에서도 저렇게 초록색 실행파일이 생겼다.


이걸 위처럼 tar.gz으로 압축해서 제출하면 되겠다.

그나저나 모르고 tar zcvf ~~.tar.gz ./ 으로 명령했다가 

root 아래 모든 파일을 압축하고있는 대실수를 한번 했다 ~_~;;

압축 푸는 옵션은 zxvf다!!


_____________________________________________________________________________________


위 스샷은 디렉토리 c의 Makefile 코드.



위 스샷은 디렉토리 a의 Makefile 코드.



위 스샷은 디렉토리 b의 Makefile 코드.




설정

트랙백

댓글