이것은 유닉스 용이므로 실행 파일에는 확장자가 없습니다.
주의해야 할 것은 root-config
올바른 컴파일 및 연결 플래그를 제공하는 유틸리티입니다. 그리고 루트에 대한 애플리케이션을 빌드하기위한 올바른 라이브러리. 이 문서의 독자층과 관련된 내용 일뿐입니다.
날 아기로 만들어
또는 당신은 당신이 처음 만든 것을 잊지
make에 대한 소개 토론과 간단한 makefile 작성 방법
Make 란 무엇입니까? 왜 내가 신경 써야합니까?
Make 라는 도구 는 빌드 종속성 관리자입니다. 즉, 소스 파일, 객체 파일, 라이브러리, 헤더 등의 모음에서 소프트웨어 프로젝트를 어떤 순서로 실행해야하는지 명령을 알아야합니다. 최근에-그리고 올바른 최신 버전의 프로그램으로 바 꾸었습니다.
사실, 당신은 다른 것들에도 Make를 사용할 수 있지만, 나는 그것에 대해 이야기하지 않을 것입니다.
사소한 메이크 파일
: 당신이 들어있는 디렉토리가 있다고 가정 tool
tool.cc
tool.o
support.cc
support.hh
하고 support.o
있는에 의존 root
하고라는 프로그램으로 컴파일되어있다 tool
, 당신은 (기존 의미하는 소스 파일에 해킹 된 적이 있다고 가정 tool
오래된 지금) 및 원하는 프로그램을 컴파일하십시오.
이 작업을 직접 수행하려면
support.cc
또는 support.hh
보다 최신 인지 확인 support.o
하고 그렇다면 다음과 같은 명령을 실행하십시오.
g++ -g -c -pthread -I/sw/include/root support.cc
support.hh
또는 tool.cc
보다 최신 인지 확인 tool.o
하고 그렇다면 다음과 같은 명령을 실행하십시오.
g++ -g -c -pthread -I/sw/include/root tool.cc
tool.o
보다 최신 인지 확인 tool
하고 그렇다면 다음과 같은 명령을 실행하십시오.
g++ -g tool.o support.o -L/sw/lib/root -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree -lRint \
-lPostscript -lMatrix -lPhysics -lMathCore -lThread -lz -L/sw/lib -lfreetype -lz -Wl,-framework,CoreServices \
-Wl,-framework,ApplicationServices -pthread -Wl,-rpath,/sw/lib/root -lm -ldl
휴! 번거 로움! 기억해야 할 것이 많고 실수 할 수있는 몇 가지 기회가 있습니다. (BTW-- 여기에 표시된 명령 줄의 세부 사항은 소프트웨어 환경에 따라 다릅니다.이 명령 줄은 내 컴퓨터에서 작동합니다.)
물론 매번 세 명령을 모두 실행할 수 있습니다. 그것은 효과가 있지만, MacBook의 기초부터 컴파일하는 데 15 분 이상 걸리는 DOGS와 같은 실질적인 소프트웨어에는 적합하지 않습니다.
대신 다음 makefile
과 같은 파일을 작성할 수 있습니다 .
tool: tool.o support.o
g++ -g -o tool tool.o support.o -L/sw/lib/root -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree -lRint \
-lPostscript -lMatrix -lPhysics -lMathCore -lThread -lz -L/sw/lib -lfreetype -lz -Wl,-framework,CoreServices \
-Wl,-framework,ApplicationServices -pthread -Wl,-rpath,/sw/lib/root -lm -ldl
tool.o: tool.cc support.hh
g++ -g -c -pthread -I/sw/include/root tool.cc
support.o: support.hh support.cc
g++ -g -c -pthread -I/sw/include/root support.cc
make
명령 행에 입력 하십시오. 위의 세 단계가 자동으로 수행됩니다.
여기에 들여 쓰기되지 않은 행은 "target : dependencies" 형식 이며, 종속 항목이 대상보다 최신 인 경우 연관된 명령 (들여진 행)을 실행해야합니다. 즉, 종속성 라인은 다양한 파일의 변경 사항을 수용하기 위해 재구성해야하는 논리를 설명합니다. support.cc
변경 사항이 있으면 support.o
다시 작성해야하지만 tool.o
단독으로 남겨 둘 수 있습니다. 때 support.o
변화는 tool
다시 작성해야합니다.
각 의존성 라인과 관련된 명령은 탭으로 시작되며 (아래 참조) 대상을 수정해야합니다 (또는 수정 시간을 업데이트하려면 적어도 터치해야합니다).
변수, 내장 규칙 및 기타 케이크
이 시점에서 makefile은 단순히 수행해야하는 작업을 기억하고 있지만 여전히 필요한 모든 명령을 모두 파악하고 입력해야했습니다. 그렇게 할 필요는 없습니다. Make는 변수, 텍스트 조작 기능 및 내장 규칙이 포함 된 강력한 언어로,이를 훨씬 쉽게 해줍니다.
변수 만들기
make 변수에 액세스하는 구문은 $(VAR)
입니다.
Make 변수에 할당하는 구문은 다음과 같습니다 VAR = A text value of some kind
(또는 VAR := A different text value but ignore this for the moment
).
이 개선 된 메이크 파일 버전과 같은 규칙에 변수를 사용할 수 있습니다.
CPPFLAGS=-g -pthread -I/sw/include/root
LDFLAGS=-g
LDLIBS=-L/sw/lib/root -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree -lRint \
-lPostscript -lMatrix -lPhysics -lMathCore -lThread -lz -L/sw/lib -lfreetype -lz \
-Wl,-framework,CoreServices -Wl,-framework,ApplicationServices -pthread -Wl,-rpath,/sw/lib/root \
-lm -ldl
tool: tool.o support.o
g++ $(LDFLAGS) -o tool tool.o support.o $(LDLIBS)
tool.o: tool.cc support.hh
g++ $(CPPFLAGS) -c tool.cc
support.o: support.hh support.cc
g++ $(CPPFLAGS) -c support.cc
좀 더 읽기 쉽지만 여전히 많은 타이핑이 필요합니다
함수 만들기
GNU make는 파일 시스템이나 시스템의 다른 명령에서 정보에 액세스하기위한 다양한 기능을 지원합니다. 이 경우 우리는에 관심이있는 $(shell ...)
인수 (들)의 출력으로 확장하는, 그리고 $(subst opat,npat,text)
의 모든 인스턴스를 대체하는 opat
과 npat
텍스트입니다.
이를 활용하면 다음과 같은 이점이 있습니다.
CPPFLAGS=-g $(shell root-config --cflags)
LDFLAGS=-g $(shell root-config --ldflags)
LDLIBS=$(shell root-config --libs)
SRCS=tool.cc support.cc
OBJS=$(subst .cc,.o,$(SRCS))
tool: $(OBJS)
g++ $(LDFLAGS) -o tool $(OBJS) $(LDLIBS)
tool.o: tool.cc support.hh
g++ $(CPPFLAGS) -c tool.cc
support.o: support.hh support.cc
g++ $(CPPFLAGS) -c support.cc
입력하기 쉽고 훨씬 더 읽기 쉽습니다.
그것을주의해라
- 우리는 여전히 각 객체 파일과 최종 실행 파일에 대한 의존성을 명시 적으로 언급하고 있습니다.
- 두 소스 파일 모두에 대해 컴파일 규칙을 명시 적으로 입력해야했습니다
암시 적 및 패턴 규칙
일반적으로 모든 C ++ 소스 파일은 동일한 방식으로 처리되어야하며 Make는이를 설명하는 세 가지 방법을 제공합니다.
- 접미사 규칙 (GNU make에서 사용되지 않는 것으로 간주되지만 이전 버전과의 호환성을 위해 유지됨)
- 암시 적 규칙
- 패턴 규칙
암시 적 규칙이 기본 제공되며 몇 가지가 아래에서 설명됩니다. 패턴 규칙은 다음과 같은 형식으로 지정됩니다
%.o: %.c
$(CC) $(CFLAGS) $(CPPFLAGS) -c $<
이는 "자동"변수 $<
가 첫 번째 종속성의 이름으로 확장 되는 표시된 명령을 실행하여 C 소스 파일에서 오브젝트 파일이 생성됨을 의미합니다 .
내장 규칙
Make에는 내장 된 규칙이 많이 있는데, 이는 매우 간단한 makefile로 프로젝트를 컴파일 할 수 있다는 의미입니다.
C 소스 파일에 대한 GNU 기본 제공 규칙은 위에 표시된 것입니다. 마찬가지로 C ++ 소스 파일에서 객체 규칙을와 같은 규칙으로 $(CXX) -c $(CPPFLAGS) $(CFLAGS)
만듭니다.
단일 객체 파일은을 사용하여 연결 $(LD) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS)
되지만 여러 객체 파일을 연결하려는 경우에는 작동하지 않습니다.
내장 규칙에 사용되는 변수
기본 제공 규칙은 모든 규칙을 다시 쓰지 않고도 로컬 환경 정보 (ROOT 포함 파일을 찾는 위치 등)를 지정할 수있는 표준 변수 세트를 사용합니다. 우리에게 가장 흥미로운 것은 다음과 같습니다.
CC
-사용할 C 컴파일러
CXX
-사용할 C ++ 컴파일러
LD
-사용할 링커
CFLAGS
-C 소스 파일의 컴파일 플래그
CXXFLAGS
C ++ 소스 파일의 컴파일 플래그
CPPFLAGS
C 및 C ++에서 사용하는 c- 전 처리기 플래그 (일반적으로 명령 줄에 정의 된 파일 경로 및 기호 포함)
LDFLAGS
-링커 플래그
LDLIBS
-링크 할 라이브러리
기본 메이크 파일
내장 규칙을 활용하여 makefile을 단순화하여 다음을 수행 할 수 있습니다.
CC=gcc
CXX=g++
RM=rm -f
CPPFLAGS=-g $(shell root-config --cflags)
LDFLAGS=-g $(shell root-config --ldflags)
LDLIBS=$(shell root-config --libs)
SRCS=tool.cc support.cc
OBJS=$(subst .cc,.o,$(SRCS))
all: tool
tool: $(OBJS)
$(CXX) $(LDFLAGS) -o tool $(OBJS) $(LDLIBS)
tool.o: tool.cc support.hh
support.o: support.hh support.cc
clean:
$(RM) $(OBJS)
distclean: clean
$(RM) tool
또한 소스 디렉토리 정리와 같은 특수 조치를 수행하는 몇 가지 표준 대상을 추가했습니다.
make가 인수없이 호출 될 때 파일에서 발견 된 첫 번째 대상 (이 경우 모두)을 사용하지만 make clean
이 경우 대상 파일을 제거 할 대상의 이름을 지정할 수도 있습니다 .
우리는 여전히 모든 의존성을 하드 코딩했습니다.
몇 가지 신비한 개선
CC=gcc
CXX=g++
RM=rm -f
CPPFLAGS=-g $(shell root-config --cflags)
LDFLAGS=-g $(shell root-config --ldflags)
LDLIBS=$(shell root-config --libs)
SRCS=tool.cc support.cc
OBJS=$(subst .cc,.o,$(SRCS))
all: tool
tool: $(OBJS)
$(CXX) $(LDFLAGS) -o tool $(OBJS) $(LDLIBS)
depend: .depend
.depend: $(SRCS)
$(RM) ./.depend
$(CXX) $(CPPFLAGS) -MM $^>>./.depend;
clean:
$(RM) $(OBJS)
distclean: clean
$(RM) *~ .depend
include .depend
그것을주의해라
- 더 이상 소스 파일에 대한 의존성 라인이 없습니다!?!
- 의존하고 의존하는 이상한 마법이 있습니다.
- 당신이 할 경우
make
다음 ls -A
당신은라는 이름의 파일을 참조 .depend
메이크업의 종속 행처럼 보이는 것들을 포함
다른 독서
버그 및 기록 메모를 알고
Make의 입력 언어는 공백에 민감합니다. 특히 종속성 다음에 나오는 조치 행은 탭으로 시작해야합니다 . 그러나 일련의 공백은 동일하게 보일 수 있으며 (실제로 탭을 공백으로 또는 그 반대로 자동으로 변환하는 편집기가 있음) 결과 파일이 올바르게 보이고 여전히 작동하지 않습니다. 이것은 (초기에 버그로 확인 되었으나 이야기가 간다 이미 10 명의 사용자가 있었기 때문에,)가 고정되지 않았습니다.
(이것은 물리학 대학원생을 위해 쓴 위키 포스트에서 복사 한 것입니다.)