2013-05-26 4 views
1

나는 메이크 파일의 기능을 테스트하기 위해 간단한 코드 * make_test *를 작성했다. 폴더 구조는 다음과 같다 :Makefile에 의한 자동 동작

# include <stdio.h> 
# include <include/maths.h> 

int main(int argc, char** argv) 
{ 
    float a=1; 
    float b=4; 

    printf("%f + %f = %f\n", a, b, add(a, b)); 
    return 0; 
} 
  • 메이크 :

    1. 폴더가 maths.h

      float add(float a, float b) 
      { 
          return a+b; 
      } 
      
    2. 주 파일은 다음 코드가 포함이 포함되어 포함 다음을 포함합니다 :

      있다는 것을 테스트/%. 의도적으로 테스트를 위해 삽입 된 C 문는
      IDIR = -I. 
      DEPS = ./include/maths.h 
      CC= gcc -Wall -g $(IDIR) 
      
      program: make_test.o 
      
      %.o: test/%.c $(DEPS) 
          @echo "Rule 1 was called" 
          $(CC) -o [email protected] $< 
      
      %.o: test/%.c $(DEPS) 
          @echo "Rule 2 was called" 
          $(CC) -o [email protected] $< 
      
      %.o: test/%.c $(DEPS) 
          @echo "Rule 3 was called" 
          $(CC) -o [email protected] $< 
      

    참고. 테스트 폴더가 없습니다. 나는 기본 파일의 변경을하고 내가 명령 줄에 만들 입력하면, 나는

    gcc -Wall -g -I. -c -o make_test.o make_test.c 
    

    내 질문에 내가 왜이 출력에 나타나지 않습니다 어디 -c 플래그를 추가하지 않은 것입니다거야? 종속성이 없거나 (test/% .c) 또는 변경된 경우 (/ maths.h 포함) 종속성이 없어 "수행 할 작업이 없습니다"라는 출력이 없습니까?

    감사합니다.

  • 답변

    5

    Make는 많은 수의 기본 제공 규칙을 포함합니다. 다음과 같이 실행하여 볼 수 있습니다 : make -p -f /dev/null. 이 규칙 중 하나가 코드를 컴파일하는 데 사용되고 있으며 -c 플래그가 포함되어 있습니다.

    기본 제공 규칙이 사용되는 이유는 무엇입니까? 정의한 규칙이 일치하지 않기 때문입니다. 그들은 test 서브 디렉토리의 .c 파일에서 .o 파일을 빌드하는 방법을 알려줍니다. 그러나 make_test.c 파일은 test 하위 디렉토리에 없으므로 make에서는 이러한 규칙을 사용할 수 없습니다. 따라서 내장 된 규칙을보고이 동일한 디렉토리에 .c에서 .o을 빌드 할 수있는 규칙을 찾아 하나를 찾아서 사용합니다.

    make_test.c 파일을 test 하위 디렉토리로 이동하면 규칙이 사용됩니다.

    여기에서 make가 올바른지 확인하십시오. .o 출력을 원하면 컴파일러 호출에 -c 플래그를 추가해야합니다. 당신의 규칙은 객체 파일을 만들지 않을 것이고, 꽤 혼란스러운 xxx.o이라는 이름의 확장자를 만들 것입니다.

    관련 문제