Makefile to compile multiple C programs?

前端 未结 8 1067
予麋鹿
予麋鹿 2020-12-02 09:41

This is an incredibly simple question, but I\'m new to makefiles. I am trying to make a makefile that will compile two independent programs:

program1:
    gc         


        
相关标签:
8条回答
  • 2020-12-02 10:14

    This will compile all *.c files upon make to executables without the .c extension as in gcc program.c -o program.

    make will automatically add any flags you add to CFLAGS like CFLAGS = -g Wall.

    If you don't need any flags CFLAGS can be left blank (as below) or omitted completely.

    SOURCES = $(wildcard *.c)
    EXECS = $(SOURCES:%.c=%)
    CFLAGS = 
    
    all: $(EXECS)
    
    0 讨论(0)
  • 2020-12-02 10:15

    Pattern rules let you compile multiple c files which require the same compilation commands using make as follows:

    objects = program1 program2
    all: $(objects)
    
    $(objects): %: %.c
            $(CC) $(CFLAGS) -o $@ $<
    
    0 讨论(0)
  • 2020-12-02 10:25
    all: program1 program2
    
    program1:
        gcc -Wall -o prog1 program1.c
    
    program2:
        gcc -Wall -o prog2 program2.c
    
    0 讨论(0)
  • 2020-12-02 10:25
    all: program1 program2
    
    program1:
        gcc -Wall -ansi -pedantic -o prog1 program1.c
    
    program2:
        gcc -Wall -ansi -pedantic -o prog2 program2.c
    

    I rather the ansi and pedantic, a better control for your program. It wont let you compile while you still have warnings !!

    0 讨论(0)
  • 2020-12-02 10:26
    ############################################################################
    # '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
    
    0 讨论(0)
  • 2020-12-02 10:26

    A simple program's compilation workflow is simple, I can draw it as a small graph: source -> [compilation] -> object [linking] -> executable. There are files (source, object, executable) in this graph, and rules (make's terminology). That graph is definied in the Makefile.

    When you launch make, it reads Makefile, and checks for changed files. If there's any, it triggers the rule, which depends on it. The rule may produce/update further files, which may trigger other rules and so on. If you create a good makefile, only the necessary rules (compiler/link commands) will run, which stands "to next" from the modified file in the dependency path.

    Pick an example Makefile, read the manual for syntax (anyway, it's clear for first sight, w/o manual), and draw the graph. You have to understand compiler options in order to find out the names of the result files.

    The make graph should be as complex just as you want. You can even do infinite loops (don't do)! You can tell make, which rule is your target, so only the left-standing files will be used as triggers.

    Again: draw the graph!.

    0 讨论(0)
提交回复
热议问题