简体   繁体   中英

Am I using a Makefile for C++ correctly?

Makefile

 default:
   (!)  g++ -Werror  -Wunused-variable -Wunused-value  -Wunused-function -Wfloat-equal -Wall -ansi -o main  -pedantic-errors main.cpp
        '/home/HomeName/Desktop/main'

I have been using this code to compile a C++ file. Is this a good way of using this code in the makefile? Moreover, I wonder if the line marked with (!) has the compiler options in the correct order.

So, your makefile itself does not contain the '(!)' marking, I believe.

What you have 'works'. It compiles the program with a stringent set of options and then runs it by absolute pathname.

However, it is not very flexible:

  • it will only build main if you run make
  • it will always build main even if you built it a moment ago
  • if you run make main , it will use a different set of commands to build the program, and it won't run the program.

It would be better - it would allow you to move the code more easily - if the line to run the program used the current directory.

And it would be better if you used some of the built-in features of make.

The C++ and C compilers are very tolerant of various orders for their options; what you have is OK.

Inside make , the C++ compiler is known by the macro CXX; it takes a set of flags defined by CXXFLAGS. You could, therefore, use:

CXX = g++
CXXFLAGS_W = -Werror -Wunused-variable -Wunused-value -Wunused-function \
             -Wfloat-equal -Wall
CXXFLAGS_M = -ansi  -pedantic-errors
CXXFLAGS   = ${CXXFLAGS_M} ${CXFLAGS_W}

all:    main
        ./main

This allows you to run make , make all and make main and get the program main built. If you use either of the first two, the program will also be run. It will only recompile the program if the source has changed since it was last compiled. If you have other programs in the directory, say 'exercise2.cpp' and 'exercise3.cpp', then you'd be able to say make exercise2 exercise3 and those would now be compiled in much the same way that main is.

If you really wanted to run the program after building it (probably not something you'd do in the long-term), then you'd probably rewrite the compilation rule (assuming GNU Make):

% : %.cpp
        ${CXX} ${CXXFLAGS} -o $@ $*.cpp
        ./$@

If you have a classic or POSIX variant of make , you'd write:

.cpp:
        ${CXX} ${CXXFLAGS} -o $@ $*.cpp
        ./$@

The notation using ' % ' is more flexible when it is available.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM