1

makefileについて何かを学んだばかりで、これが最初の質問です.main.cpp hello.cpp factorial.cppとfunctions.hファイルがあります

all: hello

hello: main.o factorial.o hello.o
    g++ main.o factorial.o hello.o -o hello

main.o: main.cpp
    g++ -c main.cpp

factorial.o: factorial.cpp
    g++ -c factorial.cpp

hello.o: hello.cpp
    g++ -c hello.cpp

clean:
    rm -rf *o hello

上記のコードで、ファイルの拡張子が .o なのはなぜですか? .cpp または .cpp と .o の使用の違いは何ですか

4

2 に答える 2

5

C++ プログラムのビルドは、2 段階のプロセスです。まず、各ファイルをオブジェクト ファイルにコンパイルします。コンパイルによってソース コードがマシン コードに変換されますが、他のソース ファイルからの関数呼び出しは解決されません (まだコンパイルされていないため)。.cpp.o

main.o: main.cpp
    g++ -c main.cpp

factorial.o: factorial.cpp
    g++ -c factorial.cpp

hello.o: hello.cpp
    g++ -c hello.cpp

次に、オブジェクト ファイルをリンクして実行可能ファイルを作成します。リンクにより、各オブジェクト ファイル内の外部参照が解決されます。

hello: main.o factorial.o hello.o
    g++ main.o factorial.o hello.o -o hello

ところで、cleanターゲットにタイプミスがあります。*oする必要があります*.o

clean:
    rm -rf *.o hello
于 2013-08-15T12:38:28.557 に答える
2

.oこれらは、ソースからコンパイルされたが、まだ実行可能ファイルまたはライブラリにリンクされていないファイルです。
あなたのメイクファイルで、すなわち

main.o : main.cpp

を使用して作成main.oされます。main.cppg++ -c main.cpp

最終的に、 を持つすべてのファイルは、に記載されているように.o実行可能ファイルを作成しますhello

hello: main.o factorial.o hello.o
     g++ main.o factorial.o hello.o -o hello
于 2013-08-15T12:35:04.870 に答える