C/C++ プロジェクトの 1 つをデバッグおよび最適化-p -g -pg
していたとき、何が起こっているかをよりよく確認するために、Makefile のプロファイリング フラグといくつかの最適化フラグを無効および有効にすることがよくありました。
ただし、GNU make
この変更を検出せず、再コンパイルを行いませんでした。
手動でmake clean
?
Stefanの上記の応答に対する提案された微調整として、ビルド構成を別のファイルに分解することができます。このファイルをコードに強制的に含める代わりに、コードのビルドに使用するすべてのmakefileルールの前提条件(つまり、コロンの右側)としてこの構成ファイルの名前をリストできます。
この問題の解決策はmakeppに組み込まれています。これにより、すべての依存関係が自動的に検出されて考慮されます。もちろん、変更されたコマンドもその1つです。
可能であれば、よりスマートなビルド システムを使用できます。私はSConsを使用していますが、このようなものが構築されています。また、ヘッダーの依存関係についてファイルを自動的にスキャンするなどの優れた機能も備えているため、手動で最新の状態に維持したり、20 個の autotools を実行したりする必要はありません。
やらなければならない基本的なことは、すべてのオブジェクトを構成ファイルに依存させることです。
c/c++ の少し正気でない解決策として、makefile と c/c++ の両方で正しい構文である以下のようなファイルを使用できます。
Makefile 自体にすべてのコンパイラ フラグを含める代わりに、次のファイル "Makefile_flags" を作成します。
#undef DUMMY
#define DUMMY /*
PROFILING_FLAGS = -p -g -pg
OPTIMIZATION_FLAGS = -O3
COMPILE_FLAGS = -Wall -Wextra -Wuninitialized -Wmissing-declarations \
-Wshadow -ftrapv -Wfloat-equal -Wundef -Wpointer-arith \
-Wcast-align -Wunreachable-code -Wold-style-cast \
-Wformat=2 -Winit-self -Werror-implicit-function-declaration \
-Wredundant-decls -Wunsafe-loop-optimizations \
-pedantic -MD -MP
CPP_STD_FLAGS = -std=c++0x
COMPILE_FLAGS += $(CPP_STD_FLAGS)
COMPILE_FLAGS += $(PROFILING_FLAGS)
COMPILE_FLAGS += $(OPTIMIZATION_FLAGS)
LINKING_FLAGS = $(COMPILE_FLAGS)
#foo */
ここ-include Makefile_flags
で、Makefile と#include "Makefile_flags"
、更新したいソース コードのすべてのファイル (たとえば、すべての *.c / *.cpp ファイル) に書き込みます。
このソリューションの美しさ: Makefile は#
コメントのシンボルとして使用するため#undef DUMMY
、ここでは効果が#define DUMMY /*
あり#foo */
ません。ただし、C/C++ では、/*
複数行のコメントに使用されます。したがって、C 以外のコード全体がコンパイラによって無視され、不明なシンボル/*
は Makefile によって認識されません。さらに、プリプロセッサ命令は2 回#undef DUMMY
実行しないように処理し、ステートメントは複数行コメント内にあります。#define DUMMY
#foo
ただし、欠点は、すべてのファイルに含める必要があることです。
ファイル「Makefile_flags」への正しい相対パスがあることを確認してください。