2017-03-18 3 views
0

안녕하세요 저는 주 파일에 링크 된 libnsd.so (nsd.c, nsd.h, nd.c, nd.h로 구성) 공유 라이브러리를 가지고 있습니다. 제 질문은 변경된 소스 파일 만 다시 컴파일 할 수 있도록 makefile을 작성하는 방법입니다. 나는 이것에 관해서 약간의 주제를 읽었지만, 다소 혼란 스러웠다. 나는 초보 프로그래머이다. 내 메이크 지금까지 코드 :C Makefile - 변경된 파일 만 다시 컴파일하십시오.

CC=gcc 

all : lib alll 

alll : main.c 
    $(CC) main.c -o main -L. libnsd.so 

lib : nsd.c nsd.h nd.c nd.h 
    $(CC) -c -fPIC nsd.c -o nsd.o 
    $(CC) -c -fPIC nd.c -o nd.o 
    $(CC) -shared -Wl,-soname,libnsd.so -o libnsd.so nsd.o nd.o 

clean: 
    rm main libnsd.so nd.o nsd.o 
+0

대상을 다시 컴파일해야하는 출력 파일과 동일한 이름으로 지정해야합니다. –

+0

(대상과 동일한 이름의 파일을 만들지 않는 대상 호출 명령이 없습니다.) –

+1

당신은 nsd.o, nd.o, libnsd.so, main을 개별 타겟으로 가지고 있습니다. –

답변

1

메이크 빌드 타겟의 개념을 가지고있다. 빌드 대상은 실제로 모든 중간 파일과 최종 파일이며 작성된 방식에 따라 종속성을 사용하도록 만들 수 있습니다.

당신의 메이크 파일의 샘플 솔루션 :

CC=gcc 

all: main 

main: main.c libnsd.so 
    $(CC) main.c -o main -L. libnsd.so 

libnsd.so: nsd.o nd.o 
    $(CC) -shared -Wl,-soname,libnsd.so -o libnsd.so [email protected] 

%.o: %.c nsd.h nd.h 
    $(CC) -c -fPIC $< -o [email protected] 

몇 가지 참고 사항 :

  1. 당신은 제대로 나는 생각하기 때문에 (오브젝트 파일 생성에 내 종속성을 수정해야한다는 C의 각 파일은 두 헤더 모두에 따라 다름).
  2. 내가 사용한 와일드 카드 구성을 기록해 두는 것이 좋습니다.
  3. 이러한 명령 중 특별한 것이 없으면 기본 명령을 그대로 두었을 수 있습니다. 첫 번째 종속성에는 $<을 사용하고 와일드 카드 규칙에는 [email protected] 출력을 사용했습니다.
  4. 질문 자체에서 올바르게 작성 되었기 때문에 clean 규칙이 복사되지 않았습니다.

타겟 각각은 (이하 "허위"타겟 all) 이외의 같은 이름의 파일을 작성 대상 libnsd.solibnsd.so 이름을 가진 파일을 생성한다. 대상 mainmain이라는 파일을 생성합니다.

대상의 종속성이 날짜를 변경하여 종속성이 출력보다 새로운 경우 make은 대상뿐만 아니라 그에 종속 된 다른 대상도 다시 만듭니다. 그러나 출력 파일에 매핑되지 않은 대상이있는 경우 해당 대상이 항상 호출됩니다 (코드에서 all 대상은 항상 호출되지만 고맙게도 명령이없고 실제 파일에만 의존하거나 필요하지 않을 수도 있음). 재 작성 중)

특히 GNU Make는 컴파일 할 필요가 없습니다. 출력 파일의 생성은 을 통해 이루어질 수 있습니다. 즉,을 의미합니다. 실제로는 대상이 .cpio.gz 아카이브를 생성하는 것을 보았습니다. 그러나 해당 보관 파일이 종속성 (폴더가 들어있는 폴더)보다 오래된 경우 make에 따라 다시 작성됩니다.

관련 문제