Loose-Info.com
Last Update 2022/11/29
TOP - 各種テスト - gcc - -oオプション

-oオプション
出力ファイル名の指定

テスト概要

その1
-o オプションを使用しない場合の出力ファイル名の確認
各コンパイル段階のデフォルト名でファイルを生成

その2
-o オプションを使用して実行ファイル名を指定してコンパイル
指定したファイル名での実行ファイルの生成

その3
・-o オプションを使用して出力ファイル名を指定して、1つのファイルのアセンブル直前までの処理を実行
・上記で生成されたファイルを利用し、-o オプションでファイル名を指定した実行ファイルの生成
各段階の指定ファイル名で実行ファイルまでの出力を完了

その4
-o オプションを使用して出力ファイル名を指定して、複数ファイルのアセンブル直前までの処理を実行
FAIL エラー発生・停止(複数ファイルを伴う場合は出力ファイル名指定不可)

実行環境

GCC-8.2.0
GNU C Library 2.28
GNU Binutils 2.31.1


コード例・出力内容中の表記

・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。

使用ファイル

各例共通

sample.h
/* -o オプション動作確認用ヘッダファイル */ #ifndef SAMPLE_H #define SAMPLE_H #define TEST_FLG 1 struct Samp { int nsamp1; int nsamp2; }; int sampFunc(struct Samp s); #endif /* SAMPLE_H */

sample.c
/* -o オプション動作確認用ソースファイル sample.c */ #include "sample.h" int sampFunc(struct Samp s) { return s.nsamp1 + s.nsamp2 + TEST_FLG; }

main.c
/* -o オプション動作確認用ソースファイル main.c */ #include "sample.h" #include <stdio.h> int main(void) { struct Samp smp; smp.nsamp1 = 1; smp.nsamp2 = 2; int n = sampFunc(smp); printf("n = %d\n", n); printf("TEST_FLG = %d\n", TEST_FLG); return 0; }

その1

-o オプションを使用しない場合の出力ファイル名

コンパイル実行
$ ls -l total 12 -rw-r--r-- 1 ****** ******** 282 *** ** **:** main.c -rw-r--r-- 1 ****** ******** 166 *** ** **:** sample.c -rw-r--r-- 1 ****** ******** 215 *** ** **:** sample.h $ gcc -v -S sample.h main.c sample.c <--- コンパイル(アセンブル直前までの処理)を実行 Using built-in specs. /usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v sample.h ... -o sample.s --output-pch=sample.h.gch ^^^ sample.hのコンパイル /usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v main.c ... -o main.s ^^^ main.cのコンパイル /usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v sample.c ... -o sample.s ^^^ sample.cのコンパイル COLLECT_GCC_OPTIONS='-v' '-S' '-mtune=generic' '-march=x86-64' $ ls -l total 1756 -rw-r--r-- 1 ****** ******** 282 *** ** **:** main.c -rw-r--r-- 1 ****** ******** 698 *** ** **:** main.s <--- 生成されたアセンブラファイル(デフォルト「.s」) -rw-r--r-- 1 ****** ******** 166 *** ** **:** sample.c -rw-r--r-- 1 ****** ******** 215 *** ** **:** sample.h -rw-r--r-- 1 ****** ******** 1774000 *** ** **:** sample.h.gch <--- プリコンパイル済みヘッダファイル(デフォルト「.gch」) -rw-r--r-- 1 ****** ******** 445 *** ** **:** sample.s <--- 生成されたアセンブラファイル(デフォルト「.s」) $ gcc -v -c main.s sample.s <--- アセンブルを実行 Using built-in specs. as -v --64 -o main.o main.s <--- main.sのアセンブル as -v --64 -o sample.o sample.s <--- sample.sのアセンブル COLLECT_GCC_OPTIONS='-v' '-c' '-mtune=generic' '-march=x86-64' $ ls -l total 1764 -rw-r--r-- 1 ****** ******** 282 *** ** **:** main.c -rw-r--r-- 1 ****** ******** 1648 *** ** **:** main.o <--- 生成されたオブジェクトファイル(デフォルト「.o」) -rw-r--r-- 1 ****** ******** 698 *** ** **:** main.s -rw-r--r-- 1 ****** ******** 166 *** ** **:** sample.c -rw-r--r-- 1 ****** ******** 215 *** ** **:** sample.h -rw-r--r-- 1 ****** ******** 1774000 *** ** **:** sample.h.gch -rw-r--r-- 1 ****** ******** 1216 *** ** **:** sample.o <--- 生成されたオブジェクトファイル(デフォルト「.o」) -rw-r--r-- 1 ****** ******** 445 *** ** **:** sample.s $ gcc -v main.o sample.o <--- オブジェクトファイルのリンク Using built-in specs. /usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/collect2 ... main.o sample.o ... COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64' $ ls -l total 1784 -rwxr-xr-x 1 ****** ******** 18392 *** ** **:** a.out <--- 生成された実行ファイル(デフォルト「a.out」) -rw-r--r-- 1 ****** ******** 282 *** ** **:** main.c -rw-r--r-- 1 ****** ******** 1648 *** ** **:** main.o -rw-r--r-- 1 ****** ******** 698 *** ** **:** main.s -rw-r--r-- 1 ****** ******** 166 *** ** **:** sample.c -rw-r--r-- 1 ****** ******** 215 *** ** **:** sample.h -rw-r--r-- 1 ****** ******** 1774000 *** ** **:** sample.h.gch -rw-r--r-- 1 ****** ******** 1216 *** ** **:** sample.o -rw-r--r-- 1 ****** ******** 445 *** ** **:** sample.s $ ./a.out n = 4 TEST_FLG = 1 $

その2

-o オプションを使用して実行ファイル名を指定してコンパイル

コンパイル実行
$ ls -l total 12 -rw-r--r-- 1 ****** ******** 282 *** ** **:** main.c -rw-r--r-- 1 ****** ******** 166 *** ** **:** sample.c -rw-r--r-- 1 ****** ******** 215 *** ** **:** sample.h $ gcc -v -o sample_test main.c sample.c <--- 実行ファイル名を「sample_test」と指定 Using built-in specs. /usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v main.c ... -o /tmp/ccOLxSEj.s ^^^ main.cのコンパイル as -v --64 -o /tmp/ccqnjcDg.o /tmp/ccOLxSEj.s <--- main.cのアセンブル /usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v sample.c ... -o /tmp/ccOLxSEj.s ^^^ sample.cのコンパイル as -v --64 -o /tmp/cc0prnId.o /tmp/ccOLxSEj.s <--- sample.cのアセンブル /usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/collect2 ... -o sample_test ... COLLECT_GCC_OPTIONS='-v' '-o' 'sample_test' '-mtune=generic' '-march=x86-64' $ ls -l total 32 -rw-r--r-- 1 ****** ******** 282 *** ** **:** main.c -rw-r--r-- 1 ****** ******** 166 *** ** **:** sample.c -rw-r--r-- 1 ****** ******** 215 *** ** **:** sample.h -rwxr-xr-x 1 ****** ******** 18392 *** ** **:** sample_test <--- 生成された実行ファイル $ ./sample_test n = 4 TEST_FLG = 1 $

その3

-o オプションを使用して出力ファイル名を指定して、1つのファイルのアセンブル直前までの処理を実行

コンパイル実行
$ ls -l total 12 -rw-r--r-- 1 ****** ******** 282 *** ** **:** main.c -rw-r--r-- 1 ****** ******** 166 *** ** **:** sample.c -rw-r--r-- 1 ****** ******** 215 *** ** **:** sample.h $ gcc -v -S -o sample_c.asm sample.c <--- 出力ファイル名を「sample_c.asm」と指定して、アセンブル直前までの処理を実行 Using built-in specs. /usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v sample.c ... -o sample_c.asm COLLECT_GCC_OPTIONS='-v' '-S' '-o' 'sample_c.asm' '-mtune=generic' '-march=x86-64' $ ls -l total 16 -rw-r--r-- 1 ****** ******** 282 *** ** **:** main.c -rw-r--r-- 1 ****** ******** 166 *** ** **:** sample.c -rw-r--r-- 1 ****** ******** 445 *** ** **:** sample_c.asm <--- 生成されたアセンブラファイル -rw-r--r-- 1 ****** ******** 215 *** ** **:** sample.h $ gcc -v -o sample_test main.c -x assembler sample_c.asm <--- 実行ファイル名を「sample_test」と指定 Using built-in specs. /usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v main.c ... -o /tmp/cca117Ds.s as -v --64 -o /tmp/cc7G5ZBs.o /tmp/cca117Ds.s as -v --64 -o /tmp/ccceBGBs.o sample_c.asm /usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/collect2 ... -o sample_test ... COLLECT_GCC_OPTIONS='-v' '-o' 'sample_test' '-mtune=generic' '-march=x86-64' $ ls -l total 36 -rw-r--r-- 1 ****** ******** 282 *** ** **:** main.c -rw-r--r-- 1 ****** ******** 166 *** ** **:** sample.c -rw-r--r-- 1 ****** ******** 445 *** ** **:** sample_c.asm -rw-r--r-- 1 ****** ******** 215 *** ** **:** sample.h -rwxr-xr-x 1 ****** ******** 18392 *** ** **:** sample_test <--- 生成された実行ファイル $ ./sample_test n = 4 TEST_FLG = 1 $

その4

-o オプションを使用して出力ファイル名を指定して、複数ファイルのアセンブル直前までの処理を実行

コンパイル実行
$ ls -l total 12 -rw-r--r-- 1 ****** ******** 282 *** ** **:** main.c -rw-r--r-- 1 ****** ******** 166 *** ** **:** sample.c -rw-r--r-- 1 ****** ******** 215 *** ** **:** sample.h $ gcc -v -S -o sample_test main.c sample.c <--- 複数ファイルが出力される-Sオプションで出力ファイル名を指定 Using built-in specs. gcc version 8.2.0 (GCC) gcc: fatal error: cannot specify -o with -c, -S or -E with multiple files compilation terminated. <--- エラー発生・停止(-c、-Eでも複数ファイルを伴う場合は出力ファイル名指定不可) $ ls -l total 12 -rw-r--r-- 1 ****** ******** 282 *** ** **:** main.c -rw-r--r-- 1 ****** ******** 166 *** ** **:** sample.c -rw-r--r-- 1 ****** ******** 215 *** ** **:** sample.h $