1

私は C++ ファイルの簡単なメイクファイルを書いていますが、ここに私が理解できない問題があります。私は2つのフォルダを持っています

.cpp ファイルの場合は /src

  • main.cpp
  • cppをチェック

.hpp ファイルの場合は /include

  • check.hpp

私のメイクファイルは次のようになります

LIBS = -lsfml-graphics -lsfml-window -lsfml-system
CC   = g++
VPATH = src include
CPPFLAGS = -I include

### Files ###
OBJ = main.o check.o

### Rules ###
all: sfml-app

sfml-app: $(OBJ)
    $(CC) -o sfml-app $(OBJ) $(LIBS)

%.o: %.c
    $(CC) -c $<

clean:
    rm -rf *o $(OBJ) 

このようなメイクファイルを使用すると、すべて正常に動作します。しかし、%.o: %.c%.o: %.cppに変更すると、彼は言った

src/main.cpp:2:21: critical  error: check.hpp: file or folder not found

C++ プロジェクトであっても、.c の代わりに .cpp を書くのは間違っていますか? これは私を少し混乱させました。.c は finde で動作し、.cpp は動作しない理由。

ご協力いただきありがとうございます :) !

4

4 に答える 4

3

C++ 言語の flags 変数は と呼ばれ、コード内で代わりにCXXFLAGS使用する必要があります。プリプロセッサ引数の変数です。$(CXX)$(CC)CPPFLAGS

于 2013-07-21T20:09:21.923 に答える
1

デフォルトのルールは次のとおりです。

C ファイルの場合:

$(CC) -c $(CPPFLAGS) $(CFLAGS) $?

C++ ファイルの場合

$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $?

リンクの場合:

$(CC) $(LDFLAGS) $^ $(LOADLIBES)

CPPFLAGS は、プリプロセッサ フラグであると想定されています。他の 2 つ (CFLAGS CXXFLAGS) は、特定の言語のフラグです。そのように使用法を調整する必要があります。

また、オブジェクト ファイルを明示的に定義するのは珍しいことです。

OBJ = main.o check.o

ソースファイルを定義する方がより一般的です。次に、ソース ファイルに関してオブジェクト ファイルを定義します。

OBJ = $(patsubst %.cpp, %.o, $(SRC))

個人的には、ディレクトリ内のすべてをビルドするのが好きなので、使用します

SRC = $(wildcard *.cpp)

しかし、これはプロジェクトに大きく依存します。

于 2013-07-21T21:53:43.840 に答える