7

-std=c++0x オプションを指定して gcc を使用して、単一のファイルをコンパイルできます。しかし、私はメイクファイルを介してこれを行うことはできません. これが私のmakefileのフラグのセットです(makeの後、c ++ 11キーワードについて文句を言います):

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

私は何が欠けていますか?

編集:次のように変更しましたが、コマンドラインのgcc呼び出しでは取得できないコンパイルエラーが引き続き発生します。

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

3 に答える 3

12

このようにして、makefileはすべてのCFLAGS:を使用します。

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

「CFLAGS=...」宣言ごとにオーバーライドします。

CXXFLAGSさらに、ではなく、である必要がありCFLAGSます。CFLAGSCアプリケーション用です。

@Florian Sowadeが言っCFLAGS += -O3 -std....たように、ユーザーがmakeを実行するときに独自のフラグを提供できるように、(またはCXXFLAGS ..)を使用できます。

于 2012-05-28T15:37:43.607 に答える
3

複数行に保持することもできますが、割り当てではなく、追加することをお勧めします。

# e.g.
CFLAGS  += -O3
CFLAGS  += -std=c++0x
CFLAGS  += -pg -D_DEBUG -g -c -Wall
于 2012-05-28T15:38:19.790 に答える
0

その混乱はどこから来たのですか?その makefile は、C++11 用に変更するずっと前から間違っていました。

最初の行から始めましょう。

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

コマンドecho `uname -s`-`uname -m`を実行してみると、とにかくスペースが含まれていないかどうかがわかります。sedコマンドのポイントは何ですか?

多分あなたはこれが欲しい:

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

これは、4 つのプロセス (2 つの unames、echo および sed) ではなく、2 つのプロセス (uname および sed) のみを実行します。

GNU make を使用している場合は、

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

したがって、実行は 1 回だけです。

CCC     = CC

とはCC?

CCC     = g++

ああ、それは問題ではありません。とにかく値を置き換えました。C++ コンパイラの従来の make 変数は次のとおりです。CXX

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

他の人が指摘しているように、CFLAGS を設定してから別のものに設定し、次に別のものに設定します。最後の値のみが保持されます。

LFLAGS  = -O
LFLAGS  = -pg -g

ここでも同じで、何LFLAGSですか?ということLDFLAGSですか?

makefile をデバッグする良い方法は、設定している変数を出力するターゲットを作成して、期待する値が含まれていることを確認することです。

print-vars:
        echo CFLAGS is $(CFLAGS)
        echo LDFLAGS is $(LDFLAGS)
于 2012-05-28T17:31:31.603 に答える