1

Ubuntu サーバーに Makefile をまとめようとしています。

ファイル構造は次のようになります。

/project
Makefile
/files
    /src
    [all .cpp files, including main.cpp]
    /include
    [all .h files]
    /obj

端末出力:

make: *files/obj/%.o', needed byターゲットをsasにするルールはありません。止まる。

私のメイクファイル:

CC=g++
CFLAGS=-c -Wall
OBJECTS=main.o Parser.o People.o Person.o Queries.o Relation.o
SOURCES=main.cpp Parser.cpp People.cpp Person.cpp Queries.cpp Relation.cpp

all: sas

sas: files/obj/%.o
        $(CC) $(OBJECTS) -o sas

files/obj/%.o: files/src/%.cpp
        $(CC) $(CFLAGS) $(SOURCES)
4

3 に答える 3

3

このメイクファイルには多くの問題があります。それらを 1 つずつ修正するには時間がかかりすぎます (私が試みたところ、数百行かかりました)。そのため、ゼロから始めましょう。この実行可能ファイルを手動で作成する場合、どのようにビルドしますか? このような:

g++ -c -Wall files/src/main.cpp -o files/obj/main.o
g++ -c -Wall files/src/Parser.cpp -o files/obj/Parser.o
...
g++ -c -Wall files/src/Relation.cpp -o files/obj/Relation.o
g++ -Wall files/obj/main.o files/obj/Parser.o ... files/obj/Relation.o -o sas

オブジェクト ファイルを作成するには、自動変数を使用してパターン ルールを記述します。

CXX=g++

files/obj/%.o: files/src/%.cpp
    $(CXX) -c -Wall $< -o $@

実行可能ファイルを構築するには、構築されたオブジェクトのリストを使用します。

MODULES = main Parser People Person Queries Relation
OBJECTS = $(patsubst %, files/obj/%.o, $(MODULES))

sas: $(OBJECTS)
    $(CXX) $^ -o $@

はまったく必要ないことに注意してくださいSOURCESmakefile でソースまたはオブジェクトのリストを維持することは良い考えだと思います(ディレクトリ構造を複雑にすることなく複数のプロジェクトがソース ファイルを共有できるため) が、そのようなリストを 2 つ維持する理由はありません。

于 2013-11-03T13:46:10.203 に答える
1

ソースのリストを手動で維持したくありませんか? あなたがしたい

CC=g++
CFLAGS=-c -Wall
SOURCES=$(wildcard files/src/*.cpp)

sas: $(SOURCES:files/src/%.cpp=files/obj/%.o)
    $(CC) $^ -o $@

files/obj/%.o: files/src/%.cpp
    $(CC) $(CFLAGS) $< -o $@
于 2013-11-03T12:17:34.903 に答える