23

私はmakefilesを初めて使用します。「GNUmakeによるプロジェクトの管理」の本から、makefileの作成やその他の関連する概念を学びました。これでmakefileの準備ができたので、作成したものに問題がないことを確認する必要があります。これがmakefileです

#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

質問

  1. 上記のmakefileは、リリースビルドとデバッグビルドでうまく機能します。しかし、それは正しい形式ですか?それとも、そこに欠陥がありますか?
  2. 上記のmakefileは、 makeを使用して呼び出された場合、デフォルトでデバッグビルドを実行します。リリースビルドの場合、make mode=releaseが必要です。これは正しいアプローチですか?
  3. g ++に提供されているデバッグおよびリリースコンパイラフラグは正しいですか?デバッグには-g-Wallを使用し、リリースには-Wallのみを使用します。これは正しいですか?

どんな助けでも素晴らしいでしょう。

4

3 に答える 3

13
  1. これは妥当な形式の1つです。これは特にGNUMakeに関連付けられていますが、すべてのプラットフォームでGNU Makeを使用することを選択した場合、これは比較的小さな問題です。
    • 欠陥がある場合は、デバッグモードでビルドされたオブジェクトファイルをリンクして、最終的なビルドを作成する可能性があります。
    • 'mode=release'オプションは非標準であると主張する人もいるかもしれません。それらは正しいでしょうが、私が知っている標準的な代替手段はありません。コンベンションがすべての人に適しているとは限らないことに注意する必要があります(ただし、必ずしもそうする必要はありません。自分とユーザーに適している必要があります)。
  2. デフォルトでデバッグビルドをビルドすることはおそらく賢明です-そしてデフォルトでリリースビルドをビルドするよりも賢明です。
  3. リリースビルドの-gフラグを削除することは自動的に悪いことではありませんが、コードがコアダンプを生成する場合、プログラムファイルにデバッグ情報が含まれていれば、コアダンプの先頭または末尾を作成する方が簡単です。情報をデバッグするための主なコストは、システムメモリにロードする必要のないプログラムファイル内の余分なセクションです。実行時のコストはわずかです。
    • そこに最適化フラグを含めるかどうかを検討する必要があります。GCCツールセットを使用すると、との両方-gを使用できます-O。最適化されたコードをデバッグするのは困難ですが、(多くの場合、重要な)パフォーマンス上の利点があります。
于 2009-04-27T05:19:07.587 に答える
11

次のモードをお勧めします。

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何かがクラッシュした場合、より多くの情報を得ることができるので、本番環境でコードを用意することをお勧めします。
于 2009-04-27T06:43:32.720 に答える
3

旗についてのArtyomのアドバイスを受けて、を利用し-Oます。

私の主なアドバイスは、デフォルトモードを「リリース」にすることです。あなたの社外のユーザーはあなたのmake mode=releaseコンベンションについて知るつもりはなく、彼らの99.99%はリリースのためにそれを構築したいと思うでしょう。

私はあなたが-Wallすべてのモードで乗っているのが好きです。あなたが本当に衒学者になりたいのなら...-Wall -std=c++98 -pedantic -Wextra -Wconversion良いスタートです。-std = c ++ 98は、g ++に慣れている場合は必要ないかもしれませんが、移植性の幻想がある場合は、それが必要になります。

于 2009-04-30T17:47:18.370 に答える