여러 개의 C 프로그램을 컴파일하기 위해 파일을 만드시겠습니까?
이건 매우 간단한 질문이지만, 저는 파일을 만드는 것은 처음입니다.두 개의 독립된 프로그램을 컴파일할 make file을 만들려고 합니다.
program1:
gcc -o prog1 program1.c
program2:
gcc -o prog2 program2.c
온라인 예제는 모두 필요 이상으로 상세하게 쓰여 있어 혼란스럽습니다.내가 정말 원하는 건 이 두 개를 작동시키는 것뿐이야gcc
제가 뭘 잘못하고 있는 걸까요?
그렇게 해.
all: program1 program2
program1: program1.c
gcc -o program1 program1.c
program2: program2.c
gcc -o program2 program2.c
고급 정보를 원하지 않는다고 하셨는데, 기본 규칙에 따라 이렇게 줄일 수도 있습니다.
all: program1 program2
program1: program1.c
program2: program2.c
패턴 규칙을 사용하면 동일한 컴파일명령어를 필요로 하는 여러 c파일을 컴파일 할 수 있습니다.make
다음과 같습니다.
objects = program1 program2
all: $(objects)
$(objects): %: %.c
$(CC) $(CFLAGS) -o $@ $<
############################################################################
# 'A Generic Makefile for Building Multiple main() Targets in $PWD'
# Author: Robert A. Nader (2012)
# Email: naderra at some g
# Web: xiberix
############################################################################
# The purpose of this makefile is to compile to executable all C source
# files in CWD, where each .c file has a main() function, and each object
# links with a common LDFLAG.
#
# This makefile should suffice for simple projects that require building
# similar executable targets. For example, if your CWD build requires
# exclusively this pattern:
#
# cc -c $(CFLAGS) main_01.c
# cc main_01.o $(LDFLAGS) -o main_01
#
# cc -c $(CFLAGS) main_2..c
# cc main_02.o $(LDFLAGS) -o main_02
#
# etc, ... a common case when compiling the programs of some chapter,
# then you may be interested in using this makefile.
#
# What YOU do:
#
# Set PRG_SUFFIX_FLAG below to either 0 or 1 to enable or disable
# the generation of a .exe suffix on executables
#
# Set CFLAGS and LDFLAGS according to your needs.
#
# What this makefile does automagically:
#
# Sets SRC to a list of *.c files in PWD using wildcard.
# Sets PRGS BINS and OBJS using pattern substitution.
# Compiles each individual .c to .o object file.
# Links each individual .o to its corresponding executable.
#
###########################################################################
#
PRG_SUFFIX_FLAG := 0
#
LDFLAGS :=
CFLAGS_INC :=
CFLAGS := -g -Wall $(CFLAGS_INC)
#
## ==================- NOTHING TO CHANGE BELOW THIS LINE ===================
##
SRCS := $(wildcard *.c)
PRGS := $(patsubst %.c,%,$(SRCS))
PRG_SUFFIX=.exe
BINS := $(patsubst %,%$(PRG_SUFFIX),$(PRGS))
## OBJS are automagically compiled by make.
OBJS := $(patsubst %,%.o,$(PRGS))
##
all : $(BINS)
##
## For clarity sake we make use of:
.SECONDEXPANSION:
OBJ = $(patsubst %$(PRG_SUFFIX),%.o,$@)
ifeq ($(PRG_SUFFIX_FLAG),0)
BIN = $(patsubst %$(PRG_SUFFIX),%,$@)
else
BIN = $@
endif
## Compile the executables
%$(PRG_SUFFIX) : $(OBJS)
$(CC) $(OBJ) $(LDFLAGS) -o $(BIN)
##
## $(OBJS) should be automagically removed right after linking.
##
veryclean:
ifeq ($(PRG_SUFFIX_FLAG),0)
$(RM) $(PRGS)
else
$(RM) $(BINS)
endif
##
rebuild: veryclean all
##
## eof Generic_Multi_Main_PWD.makefile
SRC = a.cpp b.cpp
BIN = $(patsubst %.cpp,%,$(SRC))
all: $(BIN)
clean:
rm -f $(BIN)
.PHONY: all clean
make all
다음 작업을 수행합니다.
c++ a.cpp -o a
c++ b.cpp -o b
설정했을 경우CXX
그리고.CXXFLAGS
변수make
사용할 것입니다.
all: program1 program2
program1:
gcc -Wall -ansi -pedantic -o prog1 program1.c
program2:
gcc -Wall -ansi -pedantic -o prog2 program2.c
나는 오히려 안시적이고 현학적인 표현으로 너의 프로그램을 더 잘 통제한다.경고가 아직 남아 있는 동안에는 컴파일을 할 수 없습니다!!
이것으로 모든 것이 컴파일 됩니다.*.c
에 파일을 제출make
를 사용하지 않고 실행 가능한 파일로.c
와 같은 확장gcc program.c -o program
.
make
에 추가한 플래그가 자동으로 추가됩니다.CFLAGS
맘에 들다CFLAGS = -g Wall
.
깃발이 필요 없는 경우CFLAGS
공백으로 둘 수도 있고(아래와 같이) 완전히 생략할 수도 있습니다.
SOURCES = $(wildcard *.c)
EXECS = $(SOURCES:%.c=%)
CFLAGS =
all: $(EXECS)
all: program1 program2
program1:
gcc -Wall -o prog1 program1.c
program2:
gcc -Wall -o prog2 program2.c
심플한 프로그램의 컴파일 워크플로우는 간단합니다.작은 그래프로 그릴 수 있습니다: source -> [ compilation ] -> object [ linking ] -> 실행 가능.이 그래프에는 파일(소스, 객체, 실행 파일)과 규칙(메이커의 용어)이 있습니다.그 그래프는 Makefile에 정의되어 있습니다.
make를 실행하면 Makefile이 읽혀지고 변경된 파일이 있는지 확인합니다.만약 있다면, 그것은 규칙을 트리거하고, 그것은 그것에 달려있다.규칙에 따라 추가 파일이 생성/업데이트될 수 있으며, 이로 인해 다른 규칙 등이 트리거될 수 있습니다.적절한 make 파일을 작성하면 필요한 규칙(컴파일러/link 명령)만 실행됩니다.이 규칙은 의존관계 경로의 변경된 파일에서 "다음"까지입니다.
예를 들어 Makefile을 선택하고 구문 매뉴얼을 읽고(어쨌든 첫눈에 잘 보이므로 매뉴얼을 사용하지 않음) 그래프를 그립니다.결과 파일의 이름을 확인하려면 컴파일러 옵션을 이해해야 합니다.
만들기 그래프는 원하는 만큼 복잡해야 합니다.무한 루프(하지 않음)도 가능합니다!어떤 규칙이 대상인지 알 수 있으므로 남은 파일만 트리거로 사용됩니다.
다시: 그래프를 그려라!
언급URL : https://stackoverflow.com/questions/5950395/makefile-to-compile-multiple-c-programs
'programing' 카테고리의 다른 글
open()이 잘못된 권한으로 파일을 만드는 이유는 무엇입니까? (0) | 2022.08.10 |
---|---|
Vue JS 애플리케이션의 API에서 데이터를 가져오는 테스트 코드 (0) | 2022.07.21 |
Java에서 올바른 마이크로벤치마크를 작성하려면 어떻게 해야 하나요? (0) | 2022.07.21 |
Vuex의 getter 함수 내 getter 함수를 호출하는 방법 (0) | 2022.07.21 |
"register" 키워드는 C에 있나요? (0) | 2022.07.21 |