2

私はメイクファイルが初めてで、それらは私を困惑させます。次のフォルダー階層があります。

という名前のフォルダーには、 (with file ) と(with file ) の 2 つのフォルダーがlib含まれています。また、何らかの理由でエラーが発生する Makefile も含まれています。includemylib.hsrcmylib.cpp

完全なメイクファイルは次のとおりです。

CFLAGS = -Wall -fPIC
OBJECTS = mylib.o

all: libmine.so

libmine.so: $(OBJECTS)
            g++ -shared $(CFLAGS) \
            -o libmine.so \
            $(OBJECTS)

%.o:        src/%.cpp include/%.h
            g++ $(CFLAGS) \
            -I include \
            -o %.o \
            -c src/%.cpp

clean:
            rm src/*.o
            rm libmine.so

エラーは

mr209@Quantum:~/Desktop/hw1/lib$ make
g++ -Wall -fPIC \
            -I include \
            -o %.o \
            -c src/%.cpp
g++: error: src/%.cpp: No such file or directory
g++: fatal error: no input files
compilation terminated.
make: *** [mylib.o] Error 4

しかし、ファイル存在します。したがって、make奇妙なことをしているため、.cppファイルを見つけることができません。

を作成するlibmine.soには、を使用g++して何かを行う必要があります。mylib.o一般的な.oファイルについては、数行のコードを記述しました。

これが私が考えていたことです: を作るためにはlibmine.so、 でg++何かをしなければなりませんmylib.o。したがって、 ではlib、 という名前のファイルmylib.oが表示される必要があります。一般的な%.0ルールを使用すると、このファイルはmylib.cppinsrcmylib.hinから作成されますinclude(したがって、%.oルールの最初の行)。ファイルは を使用して作成され、追加のヘッダーg++を検索する必要があり、出力として生成され、コンパイルされますが、ファイルが生成されることが保証されます。includemylib.osrc/mylib.cpp-c.o

明らかに、何かがうまくいかず、何が原因かわかりません。Makefile とは何か、なぜ Makefile の扱い方を学ばなければならないのかを知ったのはほんの 2 日前のことなので、私はそれほど専門家ではありません。

4

2 に答える 2

2

ビルド ターゲット%.oが間違っています。コマンド セクションでは を使用できないため%、宛先ファイルと依存ファイルの名前が一致することはありません。

適切な変更は、次のようにすることです。

%.o: src/%.cpp include/%.h
    g++ $(CFLAGS) \
    -I include \
    -o $@ \
    -c src/$(@:%.o=%.cpp)

変更を説明するために、-oはターゲット ファイルを必要とします。これは$@、ターゲットの名前であるため、ほぼ常に Makefile のように記述されます。

第二に、ソースファイルはターゲットに関して定義する必要があります。問題の演算子はパターン置換演算子$(@:%.o=%.cpp)であるため、ターゲットを取得します-これは のファイル名に一致し、パターン一致はに<blah>.o置き換えます。.o.cpp

したがって、ターゲットの場合mylib.o、変数$@mylib.oであり、実行の結果$(@:%.o=%.cpp)は になりmylib.oますmylib.cpp。その結果、コンパイルされるのは予想されるファイルであり、予想されるターゲットはビルドです。

それらの中でパターンを使用する%ルールは、暗黙のルールと呼ばれるものであり、記述されるコードの複雑さを軽減するために使用されます - ターゲット パターンを共有するファイルの山があるblah.o: src/blah.cpp src/blah.h場合、暗黙のルールを使用するのはターゲットを 1 回記述する必要がある場合は、ターゲットに関してコマンドを記述する必要があります。

于 2016-02-10T22:31:45.353 に答える
0

次のように g++ に入れる前に、変数を実行する必要があります。

FT_C= $(src/%.cpp) FT_O=$(FT_C:.c=.o)

g++ $(CFLAGS) -I include -o $(FT_O) -c $(FT_C)

コンパイルに .h を入れないでください。

私の言いたいことを理解したい場合は、この例を見てください。

https://github.com/emericspiroux/wolf3d/blob/master/libft/Makefile

于 2016-02-10T22:18:18.487 に答える