G ++を使用して複数の.cppおよび.hファイルをコンパイルする


172

メイン関数と他の関数の束を含む1つのcppファイルで不十分に記述されたC ++コードを継承しました。.hクラスとその関数定義を含むファイルもあります。

これまでは、プログラムはコマンドを使用してコンパイルされていましたg++ main.cpp。クラス.h.cppファイルを分離したので、メイクファイルを使用する必要がありg++ main.cppますか、それともコマンドを使用できますか?

回答:


224

main.cppの後に他のすべてのcppファイルをリストします。

すなわち

g++ main.cpp other.cpp etc.cpp

等々。

または、それらをすべて個別にコンパイルすることもできます。次に、生成されたすべての「.o」ファイルをリンクします。


152
あなたも行うことができますg++ *.cpp -o output
rubenvb 2010

7
とにかくこれは悪い習慣ですか?これをメイクファイルで使用したいと思います。
gabriel_vincent 2013

8
@gabriel_vincent、それは必ずしも悪い習慣ではありませんが、何百ものプロジェクトで1つのファイルを編集すると、コンパイラーがすべてのファイルのすべての作業をやり直すことになります。個別にコンパイルすると、増分コンパイルが可能になります。
Paul Draper

@gabriel_vincentそもそもメイクファイルを手作業で書くべきではありません。代わりに、CMakeなどの適切なビルドシステムを使用してください。
Baum mit Augen

3
@BaummitAugenええ、私が14分で書いたこの小さな2ファイルプログラムをコンパイルしたいだけなのを除いて、1時間かけてcmakeを1時間セットアップするのではなく、makefileを書くことを好みます。
Przemek D

55

リンクせずに個別にコンパイルするには、-cオプションを追加する必要があります。

g++ -c myclass.cpp
g++ -c main.cpp
g++ myclass.o main.o
./a.out

3
あなたはリンクステップで実行可能ファイルの名前を制御したい場合はちょうどあなたが、通常は何をすべきかの操作を行います。g++ -o my_executable myclass.o main.o
エリック・

22

クラスを.hファイルと.cppファイルに分離したので、makefileを使用する必要がありますか、それとも「g ++ main.cpp」コマンドを使用できますか?

一度に複数のファイルをコンパイルすることは、それをMakefileに入れる場合には適切ではありません。

通常、Makefile(GNU / Makeの場合)では、次のように記述すれば十分です。

# "all" is name of the default target, running "make" without params would use it
all: executable1

# for C++, replace CC (c compiler) with CXX (c++ compiler) which is used as default linker
CC=$(CXX)

# tell which files should be used, .cpp -> .o make would do automatically
executable1: file1.o file2.o

そうmakeすれば、再コンパイルが必要なものだけが適切に再コンパイルされます。ヘッダーファイルの依存関係を生成するためにいくつかの調整を追加することもできます。これにより、makeはヘッダーファイルの変更により再構築する必要があるものも適切に再構築します。


13

必要に応じて、引き続きg ++を直接使用できます。

g++ f1.cpp f2.cpp main.cpp

ここで、f1.cppおよびf2.cppは、関数が含まれているファイルです。makeを使用してビルドを行う方法の詳細については、優れたGNU makeのドキュメントを参照してください。


12

私はこの質問が何年も前に尋ねられたことを知っていますが、それでも私が通常複数のc ++ファイルをコンパイルする方法を共有したいと思いました。

  1. 5つのcppファイルがあるとしましょうg++ -c *.cpp -o myprogram。たとえば、各cppファイル名をEgと入力する代わりに、*を使用するだけです 。
  2. これは生成されます "myprogram"
  3. プログラムを実行する ./myprogram

それで全部です!!

私が*を使用している理由は、30個のcppファイルがある場合、それらすべてを入力するとしたらどうでしょうか。または*記号を使用して時間を節約する:)

psこの方法は、makefileを気にしない場合にのみ使用してください。


1
このアプローチを使用すると再定義エラーが発生しますか?同じことをする別の方法はありますか?
Waseem Ahmad Naeem 2017

11

.h ファイルはコンパイルとは何の関係もありません...あなたはcppファイルだけを気にします...それでタイプしてください g++ filename1.cpp filename2.cpp main.cpp -o myprogram

は、各cppファイルをコンパイルし、それらを一緒ににリンクすることを意味しますmyprgram

次に、プログラムを実行します ./myprogram


7

以下のようrebenvp私が使用言いました:

g++ *.cpp -o output

そして、出力のためにこれを行います:

./output

しかし、より良い解決策はmakeファイルを使用することです。ファイルの詳細については、こちらをお読みくださいmake

また、必要な.hファイルをファイルに追加したことを確認してください.cpp


4

いくつかのg ++​​コマンドを使用してからリンクできますが、最も簡単なのは、従来のMakefileまたは他のビルドシステムを使用することです。



1

以前は、現在のディレクトリにあるすべてのファイルをコンパイルするカスタムMakefileを使用していましたが、必要なときにすべてのディレクトリにコピーする必要がありました。

そこで、私は独自のツールを作成しました- 多くのファイルをコンパイルするときにプロセスをはるかに簡単にするUniversal Compilerです。


-4

〜/ In_ProjectDirectory $ g ++ coordin_main.cpp coordin_func.cpp coordin.h

〜/ In_ProjectDirectory $ ./a.out

...働いた!

Geany IDEでのLinux Mintの使用

各ファイルを同じディレクトリに保存すると、1つのファイルがディレクトリ内に正しく保存されませんでした。coordin.hファイル。そのため、再確認するとcoordin.hとして保存され、-> coordin.h.gchとして誤って保存されていません。ちょっとしたもの。引数!!


3
エラーであるhファイルが含まれているため、反対投票されています。
エリック2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.