web-dev-qa-db-ja.com

複数のCソースファイルを一意のオブジェクトファイルにコンパイルします

いくつかのCソースファイルがあり、gccを使用しています。基本的には、それらすべてをコンパイルして、1つのオブジェクトファイルを作成したいと思います。私が試してみると:

gcc -c src1.c src2.c src3.c -o final.o

私は得る:

gcc: cannot specify -o with -c or -S with multiple files

私が試してみると:

gcc -c src1.c src2.c src3.c

3つの異なるオブジェクトファイルを取得します。 gccに、すべてのファイルをコンパイルして1つの単一オブジェクトファイルを返すように指示するにはどうすればよいですか(名前も指定したい)。ありがとうございました。

これには別のより一般的なアプローチがあるかもしれませんが、この場合は教えてください。

14
Andry

複数のソースファイルを単一のオブジェクトファイルにコンパイルすることはできません。オブジェクトファイルは、単一のソースファイルとそのヘッダー( translation unit とも呼ばれます)のコンパイル結果です。

コンパイルされたファイルを結合する場合は、通常、 ar コマンドを使用して静的ライブラリに結合されます。

$ ar cr libfoo.a file1.o file2.o file3.o

次に、リンク時にこの静的ライブラリを使用して、オブジェクトファイルとして直接渡すことができます。

$ gcc file4.o libfoo.a -o myprogram

または、-lフラグを使用してライブラリとしてリンクします

$ gcc file4.o -L. -lfoo -o myprogram
15

これは通常の方法ではありませんが、次の内容の新しいfinal.cファイルを作成することで、目的を簡単に実現できます。

#include "src1.c"
#include "src2.c"
#include "src3.c"

次に、次のようにコンパイルできます。

gcc -c final.c -o final.o

個別にコンパイルしたときに各ファイルが正常にコンパイルされた場合でも、問題が発生する可能性があることに注意してください。コンパイルエラーを読み取ります。これは特にマクロ定義で発生する傾向があり、mergingソースファイルをこの方法で1つにまとめる場合が含まれます。

11
Didier Trosset

あなたはこれを探しているかもしれません:

ld -r src1.o src2.o src3.o -o final.o

しかし、それらをアーカイブしておくことは常に素晴らしいことです。

ar rvs libmy.a file1.o file2.o file3.o

次に、-lmyを使用してリンクします。

5
P0W

複数のソースファイルを単一のオブジェクトファイルに結合するには(少なくともgcc 4.1以降)、コンパイラ/リンカーオプション--combineを使用します。

(編集)後でコンパイラオプション-fltoに置き換えられ、コンパイル状態に応じて自動的にリンクされます: fltoを使用するための要件

4
david

すべてのfinal.cファイルを含む.cを作成してから、gcc -c final.cコマンドを使用してこのファイナルをコンパイルできます。

または

もう1つの方法は、archiveを使用することです。すべてのファイルをビルドしてそれぞれの.oを取得し、それらすべての.oファイルを含む1つのライブラリにアーカイブします。

0
Dayal rai

ファイルはいつでもGCCにパイプできます。

join file1.c file2.c file3.c | gcc -x c -c -o single.o -

言語「-xc」を指定するオプションを忘れないでください。これは、ファイル拡張子から推測できなくなりました。末尾に1つのダッシュ「-」を付けてstdinからの入力を受け入れるようにGCCに指示します。

これは、次の内容のファイル「final.c」をコンパイルすることと同じであることに注意してください。

#include "file1.c"
#include "file2.c"
#include "file3.c"

gcc -c -o single.o final.c
0
rubenvb

使ってみてください

gcc -o final file1.c file2.c file3.c

わたしにはできる。

0