C++학습 진급 의 Makefile 기초 용법 상세 설명

9045 단어 c + +makefile문법
1.Makefile 기본 문법 및 실행
Makefile 을 왜 사용 하 세 요?
Makefile 파일 은 전체 프로젝트 의 컴 파일,링크 규칙 을 설명 합 니 다.
프로젝트 를 위해 Makefile 을 작성 하 는 것 은'자동화 컴 파일'을 완성 하 는 명령 을 사용 할 수 있다 는 것 이 장점 입 니 다.하나의 정확 한 Makefile 만 제공 하면 다음 컴 파일 은 터미널 에"make"명령 만 입력 하면 전체 공정 이 자동 으로 컴 파일 되 어 효율 을 크게 향상 시 킬 수 있 습 니 다.특히 작은 파일 만 바 뀐 큰 프로젝트 를 컴 파일 하 는 경우.
대부분의 IDE 개발 환경 은 사용자 에 게 Makefile 을 자동 으로 작성 합 니 다.
Make 는 어떻게 일 합 니까?
Make 작업 의 원칙 은:
대상 파일 이 의존 파일(dependencies)의 변경 시간 스탬프 가 대상 파일 의 생 성 시간 스탬프 보다 새 것 일 때 만 이 대상 파일 을 다시 컴 파일 해 야 합 니 다.
Make 도 구 는 모든 의존 파일 을 옮 겨 다 니 며 대상 파일 을 업데이트 합 니 다.컴 파일 된 명령 과 이 대상 파일 및 이에 대응 하 는 의존 파일 의 관 계 는 모두 Makefile 에 저 장 됩 니 다.
Makefile 에서 도 대상 파일 을 만 드 는 방법,실행 가능 한 파일 을 만 드 는 방법 등 정 보 를 지정 합 니 다.
그 밖 에 Makefile 에 호출 하고 싶 은 시스템 터미널 명령 을 저장 해서 Shell 스 크 립 트 처럼 사용 할 수도 있 습 니 다.
역할:
Makefile 파일 은 Make 가 프로그램 으로 컴 파일 하고 연결 하 는 방법 을 알려 줍 니 다.
사용 가능 한 명령 dnf install make 설치 make 기능
형식:
다음 형식 으로 Makefile 을 작성 합 니 다.
대상(target):의존(prerequires)...
  명령(command)
메모:모든 명령 줄 앞 에 Tab 문자 가 있어 야 합 니 다.즉,명령 줄 의 첫 번 째 문 자 는 Tab 입 니 다.
실험:
vim Makefile 편집 파일:

simpletest:simple.o simpletest.o
        g++ simple.o simpletest.o -o simpletest
simple.o:simple.cpp
        g++ -c simple.cpp -o simple.o
simpletest.o:simpletest.cpp
        g++ -c simpletest.cpp -o simpletest.o
결 과 는:
[root@foundation1 shishi]# make
g++ -c simple.cpp -o simple.o
g++ -c simpletest.cpp -o simpletest.o
g++ simple.o simpletest.o -o simpletest
명령 의 상하 에는 순서 가 있 고,이전 줄 은 다음 줄 에 의존 관계 가 있다.
폴 더 에.o 파일 이 있 으 면 make 후 생 성 되 었 음 을 알려 줍 니 다.o 파일 을 삭제 한 후 make 해 야 합 니 다.
clean 의 역할:지정 되 었 을 때 대응 하 는.o 파일 을 삭제 하여 상기 상황 을 피 합 니 다.

simpletest:simple.o simpletest.o
        g++ simple.o simpletest.o -o simpletest
simple.o:simple.cpp
        g++ -c simple.cpp -o simple.o
simpletest.o:simpletest.cpp
        g++ -c simpletest.cpp -o simpletest.o
clean:
        rm simpletest simple.o simpletest.o
결 과 는:
[root@foundation1 shishi]# make clean
rm simpletest simple.o simpletest.o
[root@foundation1 shishi]# make
g++ -c simple.cpp -o simple.o
g++ -c simpletest.cpp -o simpletest.o
g++ simple.o simpletest.o -o simpletest
2.Makefile 간소화 과정
사용 변수:특정한 파일 을 호출 하 는 횟수 가 많 으 면 변 수 를 사용 하여 대체 할 수 있 고 변 수 는 직접 교체 할 수 있 습 니 다.
변수 정의:변수=문자열
변수 사용:$(변수 이름)
makefile 파일 을 다음 으로 변경 할 수 있 습 니 다:

TARGET = simpletest
OBJS = simple.o simpletest.o

$(TARGET):$(OBJS)
        g++ $(OBJS) -o $(TARGET)
simple.o:simple.cpp
        g++ -c simple.cpp -o simple.o
simpletest.o:simpletest.cpp
        g++ -c simpletest.cpp -o simpletest.o
clean:
        rm $(TARGET) $(OBJS)
명령 자동 유도:.cpp 파일 은 모두 대응 하 는.o 파일 을 생 성 하기 때문에 makefile 파일 은 자동 으로 식별 할 수 있 습 니 다.
makefile 파일 을 다음 으로 변경 할 수 있 습 니 다:

TARGET = simpletest
OBJS = simple.o simpletest.o

$(TARGET):$(OBJS)
        g++ $(OBJS) -o $(TARGET)
simple.o:simple.cpp
simpletest.o:simpletest.cpp
clean:
        rm $(TARGET) $(OBJS)
미리 정 의 된 변수:시스템 에서 자신 도 변 수 를 정 의 했 습 니 다.
변량
순서
기본 값
CC
C 언어 컴 파일 러
cc
CXX
C++컴 파일 러
g++
AR
C++패키지 프로그램
ar
CPP
표준 출력 이 있 는 C 언어 사전 처리 프로그램
$(CC) -E
RM
명령 삭제
rm
makefile 파일 을 다음 으로 변경 할 수 있 습 니 다:

TARGET = simpletest
OBJS = simple.o simpletest.o

$(TARGET):$(OBJS)
        $(CXX) $(OBJS) -o $(TARGET)
simple.o:simple.cpp
simpletest.o:simpletest.cpp
clean:
        $(RM) $(TARGET) $(OBJS)
가상 목표:폴 더 에 clean 파일 이 있 으 면 make clean 을 사용 할 수 없습니다.가상 목 표를 사용 해 야 합 니 다.명령 을 수행 할 때 폴 더 에 있 는 파일 을 보지 않 고 바로 유효 합 니 다.
makefile 파일 을 다음 으로 변경 할 수 있 습 니 다:

TARGET = simpletest
OBJS = simple.o simpletest.o

.PHONY: clean

$(TARGET):$(OBJS)
        $(CXX) $(OBJS) -o $(TARGET)
simple.o:simple.cpp
simpletest.o:simpletest.cpp
clean:
        $(RM) $(TARGET) $(OBJS)
대상 파일 을 만 들 지 않 는 명령 을 가상 목표 로 설정 하 는 것 을 권장 합 니 다.
3.Makefile 생 성 및 라 이브 러 리 사용
3.1 동적 라 이브 러 리 의 구축 과 사용
vim Makefile 편집 파일:

TARGET = simpletest
OBJS = simple.o
LIB = libsimple.so
CXXFLAGS = -c -fPIC

.PHONY: clean

$(TARGET):$(LIB) simpletest.o
        $(CXX) simpletest.o -o $(TARGET) -L. -lsimple
$(LIB):$(OBJS)
        $(CXX) -shared $(OBJS) -o $(LIB)
simple.o:simple.cpp
        $(CXX) $(CXXFLAGS) simple.cpp -o $(OBJS)
simpletest.o:simpletest.cpp
        $(CXX) $(CXXFLAGS) simpletest.cpp -o simpletest.o
clean:
        $(RM) $(TARGET) $(OBJS) $(LIB)
결 과 는:
[root@foundation1 shishi]# make clean
rm -f simpletest simple.o libsimple.so
[root@foundation1 shishi]# make
g++ -c -fPIC simple.cpp -o simple.o
g++ -shared simple.o -o libsimple.so
g++ -c -fPIC simpletest.cpp -o simpletest.o
g++ simpletest.o -o simpletest -L. -lsimple
미리 정 의 된 변수:
아니면 앞에서 정의 해 야 돼 요?
변량
프로그램 매개 변수
CFLAGS
C 컴 파 일 러 에 사용 할 추가 표지
CXXFLAGS
C++컴 파일 러 에 사용 할 추가 표지
ARFLAGS
C/C++포장 기 에 사용 할 추가 표지
LDFLAGS
링크 라 이브 러 리 경로-L
LDLIBS
링크 라 이브 러 리-l
makefile 파일 을 다음 으로 변경 할 수 있 습 니 다:

TARGET = simpletest
OBJS = simple.o
LIB = libsimple.so
CXXFLAGS = -c -fPIC
LDFLAGS = -L.
LDLIBS = -lsimple

.PHONY: clean

$(TARGET):$(LIB) simpletest.o
        $(CXX) simpletest.o -o $(TARGET) $(LDFLAGS) $(LDLIBS)
$(LIB):$(OBJS)
        $(CXX) -shared $(OBJS) -o $(LIB)
simple.o:simple.cpp
        $(CXX) $(CXXFLAGS) simple.cpp -o $(OBJS)
simpletest.o:simpletest.cpp
        $(CXX) $(CXXFLAGS) simpletest.cpp -o simpletest.o
clean:
        $(RM) $(TARGET) $(OBJS) $(LIB)
자동 변수:
자동 변 수 는 규칙 이 실 행 될 때마다 목표 와 의존 을 바탕 으로 새로운 값 을 만 드 는 변수 입 니 다.
자동 변수
속뜻
$<
첫 번 째 일치 하 는 의존 도 를 표시 합 니 다.
$@
표적 을 나타내다
$^
모든 의존
$?
모든 의존 에서 업 데 이 트 된 파일
$+
모든 의존 파일 은 무 겁 지 않 습 니 다.
$(@D)
대상 파일 경로
$(@F)
대상 파일 이름
makefile 파일 을 다음 으로 변경 할 수 있 습 니 다:

TARGET = simpletest
OBJS = simple.o
LIB = libsimple.so
CXXFLAGS = -c -fPIC
LDFLAGS = -L.
LDLIBS = -lsimple

.PHONY: clean

$(TARGET):simpletest.o $(LIB)
        $(CXX) $< -o $@ $(LDFLAGS) $(LDLIBS)
$(LIB):$(OBJS)
        $(CXX) -shared $^ -o $@
simple.o:simple.cpp
        $(CXX) $(CXXFLAGS) $< -o $@
simpletest.o:simpletest.cpp
        $(CXX) $(CXXFLAGS) $< -o $@
clean:
        $(RM) $(TARGET) $(OBJS) $(LIB)
자동 일치:
마스크 는 파일 이름 과 일치 하 는 데 사 용 됩 니 다.Makefile 에 서 는%를 마스크 로 사용 합 니 다.대상 형식 과 일치 하 는 대상 이름 에서 마스크 에 따라 일부 문자열 을 추출 한 다음 추출 문자열 에 따라 모든 의존 형식 에 의존 하 는 이름 을 할당 합 니 다.예 를 들 어%o:%.cpp 를 사용 합 니 다.
중복 되 는 문 구 를 한 문장 으로 합 칠 수 있다.
makefile 파일 을 다음 으로 변경 할 수 있 습 니 다:

TARGET = simpletest
OBJS = simple.o
LIB = libsimple.so
CXXFLAGS = -c -fPIC
LDFLAGS = -L.
LDLIBS = -lsimple
TESTOBJ = simpletest.o

.PHONY: clean

$(TARGET):$(TESTOBJ) $(LIB)
        $(CXX) $< -o $@ $(LDFLAGS) $(LDLIBS)

$(LIB):$(OBJS)
        $(CXX) -shared $^ -o $@

$(TESTOBJ) $(OBJS):%.o:%.cpp
        $(CXX) $(CXXFLAGS) $< -o $@

clean:
        $(RM) $(TARGET) $(OBJS) $(LIB) $(TESTOBJ)

3.2 동적 로드 라 이브 러 리 의 구축 과 사용

TARGET = simpletest2
OBJS = simple.o
LIB = libsimple.so
CXXFLAGS = -c -fPIC
LDLIBS = -ldl
TESTOBJ = simpletest2.o

.PHONY: clean

#        
$(TARGET):$(TESTOBJ) $(LIB)
        $(CXX) $< -o $@ $(LDFLAGS) $(LDLIBS)

#    
$(LIB):$(OBJS)
        $(CXX) -shared $^ -o $@

#       
$(TESTOBJ) $(OBJS):%.o:%.cpp
        $(CXX) $(CXXFLAGS) $< -o $@

clean:
        $(RM) $(TARGET) $(OBJS) $(LIB) $(TESTOBJ)
결 과 는:
[root@foundation1 C++7.4]# make clean
rm -f simpletest2 simple.o libsimple.so simpletest2.o
[root@foundation1 C++7.4]# make
g++ -c -fPIC simpletest2.cpp -o simpletest2.o
g++ -c -fPIC simple.cpp -o simple.o
g++ -shared simple.o -o libsimple.so
g++ simpletest2.o -o simpletest2  -ldl
[root@foundation1 C++7.4]# ./simpletest2
Simple()
Test()
~Simple()
총결산
여기 서 C++학습 진급 의 Makefile 기초 용법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C+Makefile 기초 용법 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기