Makefileは初めてです。 「GNU make」を使用したプロジェクトの管理」の本から、メイクファイルの作成とその他の関連概念を学びました。メイクファイルの準備ができたので、作成したものに問題がないことを確認する必要があります。これがメイクファイルです。
#Main makefile which does the build
#makedepend flags
DFLAGS =
#Compiler flags
#if mode variable is empty, setting debug build mode
ifeq ($(mode),release)
CFLAGS = -Wall
else
mode = debug
CFLAGS = -g -Wall
endif
CC = g++
PROG = fooexe
#each module will append the source files to here
SRC := main.cpp
#including the description
include bar/module.mk
include foo/module.mk
OBJ := $(patsubst %.cpp, %.o, $(filter %.cpp,$(SRC)))
.PHONY:all
all: information fooexe
information:
ifneq ($(mode),release)
ifneq ($(mode),debug)
@echo "Invalid build mode."
@echo "Please use 'make mode=release' or 'make mode=debug'"
@exit 1
endif
endif
@echo "Building on "$(mode)" mode"
@echo ".........................."
#linking the program
fooexe: $(OBJ)
$(CC) -o $(PROG) $(OBJ)
%.o:%.cpp
$(CC) $(CFLAGS) -c $< -o $@
depend:
makedepend -- $(DFLAGS) -- $(SRC)
.PHONY:clean
clean:
find . -name "*.o" | xargs rm -vf
rm -vf fooexe
質問
どんな助けでも素晴らしいでしょう。
-g
フラグを削除しても、自動的に悪いわけではありませんが、コードでコアダンプが生成された場合、プログラムファイルにデバッグ情報が含まれていれば、コアダンプの先頭または末尾を作成する方が簡単です。情報をデバッグするための主なコストは、システムメモリにロードする必要のないプログラムファイル内の余分なセクションです。実行時のコストはわずかです。-g
と-O
の両方を使用できます。最適化されたコードをデバッグするのは困難ですが、(多くの場合、重要な)パフォーマンス上の利点があります。次のモードをお勧めします。
for debugger: -O0 -g -Wall
for development and internal release: -O2 -g -Wall
for release outside the company: -O2 -Wall
理論的根拠:
-O2
を使用します-g
を追加します。ただし、このようなモードでバグを見つけるのが難しすぎる場合は、-O0
を使用してデバッガー用にコンパイルできます。-g
を削除する必要があります。本番環境のコードには-g
を用意することをお勧めします。何かがクラッシュした場合、より多くの情報を取得できるからです。フラグに関するArtyomのアドバイスを参考にして、-O
を利用します。
私の主なアドバイスは、デフォルトモードを「リリース」にすることです。社外のユーザーはあなたのmake mode=release
規則について知ることはなく、99.99%のユーザーがリリース用に構築することを望んでいます。
すべてのモードで-Wall
がオンになっているのが好きです。あなたが本当に衒学者になりたいのなら...-Wall -std=c++98 -pedantic -Wextra -Wconversion
は良いスタートです。 -std = c ++ 98は、g ++に慣れている場合は必要ないかもしれませんが、移植性の幻想がある場合は、それが必要になります。