简体   繁体   中英

Makefile modification to support c++11

I am able to compile a single file using gcc with -std=c++0x option. But I can't do this through makefile. Here are the set of flags in my makefile (which after make complains about c++11 keywords):

MACHINE = $(shell echo `uname -s`-`uname -m` | sed "s/ //g")
CCC     = CC
CCC     = g++
CFLAGS  = -O3
CFLAGS  = -std=c++0x
CFLAGS  = -pg -D_DEBUG -g -c -Wall
LFLAGS  = -O
LFLAGS  = -pg -g

What am I missing?

Edit : I changed it to the following, but I still get compile errors, which I don't get with command line gcc invocation.

CXXFLAGS=-O3 -std=c++0x -pg -D_DEBUG -g -c -Wall

This way your makefile will use all of your CFLAGS :

CFLAGS=-O3 -std=c++0x -pg -D_DEBUG -g -c -Wall

You're overriding them with each "CFLAGS=..." declaration.

Moreover, it should be CXXFLAGS , not CFLAGS . CFLAGS is for C applications.

As @Florian Sowade said, you could use CFLAGS += -O3 -std.... (or CXXFLAGS..), so that users can provide their own flags when executing make.

You can keep it in multiple lines, but you probably want to append , not to assign :

# e.g.
CFLAGS  += -O3
CFLAGS  += -std=c++0x
CFLAGS  += -pg -D_DEBUG -g -c -Wall

Where did you get that mess from? That makefile was wrong long before you modified it for C++11.

Let's start with the first line:

MACHINE = $(shell echo `uname -s`-`uname -m` | sed "s/ //g")

Try running the command echo `uname -s`-`uname -m` and you'll see if has no spaces in anyway, so what's the point in the sed command?

Maybe you want this:

MACHINE = $(shell uname -s -m | sed "s/ /-/g")

That only runs two processes (uname and sed) not four (two unames, echo and sed)

If you're using GNU make it should be

MACHINE := $(shell uname -s -m | sed "s/ /-/g")

So it's only run once.

CCC     = CC

What is CC ?

CCC     = g++

Oh, it doesn't matter, you've replaced the value anyway. The conventional make variable for the C++ compiler is CXX

CFLAGS  = -O3
CFLAGS  = -std=c++0x
CFLAGS  = -pg -D_DEBUG -g -c -Wall

As others have pointed out, you set CFLAGS, then set it to something different, then to something different. Only the last value will be kept.

LFLAGS  = -O
LFLAGS  = -pg -g

Same here, and what is LFLAGS ? Do you mean LDFLAGS ?

A good way to debug makefiles is to create a target to print out the variables you are setting, to check they have the values you expect:

print-vars:
        echo CFLAGS is $(CFLAGS)
        echo LDFLAGS is $(LDFLAGS)

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