Loose-Info.com
Last Update 2021/12/11
TOP - 各種テスト - gcc - -MD オプション

-MD
-Mオプションと同様の依存関係出力をファイルに対して実施

テスト概要

その1
-MDオプションのみを指定して実行

その2
-MDオプションと-Eオプションを指定して実行

その3
-MDオプションと-oオプションを指定して実行

その4
-MDオプション、-Eオプション、および-oオプションを指定して実行

実行環境

GCC-8.2.0
GNU C Library 2.28
GNU Binutils 2.31.1


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

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

使用ファイル

sample.h
#ifndef SAMPLE_H #define SAMPLE_H #include "func.h" #endif /* SAMPLE_H */

sample.c
#include "sample.h" int main(void) { sampFunc(); return 0; }

func.h
#ifndef FUNC_H #define FUNC_H void sampFunc(void); #endif /* FUNC_H */

func.c
#include "func.h" void sampFunc(void) { }

その1

-MDオプションのみを指定して実行
$ gcc -MD sample.c func.c $ ls -l total 44 -rwxr-xr-x 1 ****** ******** 18152 *** ** **:** a.out -rw-r--r-- 1 ****** ******** 44 *** ** **:** func.c -rw-r--r-- 1 ****** ******** 49 *** ** **:** func.d -rw-r--r-- 1 ****** ******** 74 *** ** **:** func.h -rw-r--r-- 1 ****** ******** 66 *** ** **:** sample.c -rw-r--r-- 1 ****** ******** 62 *** ** **:** sample.d -rw-r--r-- 1 ****** ******** 77 *** ** **:** sample.h $ ソースファイルの依存関係を拡張子「.d」のファイルとして出力 コンパイル完了後、実行ファイルも出力
出力ファイル(func.d)
(着色部はカレントディレクトリ内のファイル)
func.o: func.c /usr/include/stdc-predef.h func.h
出力ファイル(sample.d)
(着色部はカレントディレクトリ内のファイル)
sample.o: sample.c /usr/include/stdc-predef.h sample.h func.h

その2

-MDオプションと-Eオプションを指定して実行
$ gcc -MD -E sample.c func.c # 1 "sample.c" # 1 "<built-in>" # 1 "<command-line>" # 31 "<command-line>" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 32 "<command-line>" 2 # 1 "sample.c" # 1 "sample.h" 1 # 1 "func.h" 1 void sampFunc(void); # 5 "sample.h" 2 # 2 "sample.c" 2 int main(void) { sampFunc(); return 0; } # 1 "func.c" # 1 "<built-in>" # 1 "<command-line>" # 31 "<command-line>" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 32 "<command-line>" 2 # 1 "func.c" # 1 "func.h" 1 void sampFunc(void); # 2 "func.c" 2 void sampFunc(void) { } $ ls -l total 24 -rw-r--r-- 1 ****** ******** 44 *** ** **:** func.c -rw-r--r-- 1 ****** ******** 49 *** ** **:** func.d -rw-r--r-- 1 ****** ******** 74 *** ** **:** func.h -rw-r--r-- 1 ****** ******** 66 *** ** **:** sample.c -rw-r--r-- 1 ****** ******** 62 *** ** **:** sample.d -rw-r--r-- 1 ****** ******** 77 *** ** **:** sample.h $ ソースファイルの依存関係を拡張子「.d」のファイルとして出力 -Eオプションによりプリプロセス実行後に停止。実行ファイルの出力は無し
出力ファイル(func.d)
(着色部はカレントディレクトリ内のファイル)
func.o: func.c /usr/include/stdc-predef.h func.h
出力ファイル(sample.d)
(着色部はカレントディレクトリ内のファイル)
sample.o: sample.c /usr/include/stdc-predef.h sample.h func.h

その3

-MDオプションと-oオプションを指定して実行
$ gcc -v -MD -o smpl sample.c func.c $ ls -l total 40 -rw-r--r-- 1 ****** ******** 44 *** ** **:** func.c -rw-r--r-- 1 ****** ******** 74 *** ** **:** func.h -rw-r--r-- 1 ****** ******** 66 *** ** **:** sample.c -rw-r--r-- 1 ****** ******** 77 *** ** **:** sample.h -rwxr-xr-x 1 ****** ******** 18152 *** ** **:** smpl -rw-r--r-- 1 ****** ******** 47 *** ** **:** smpl.d $ ソースファイルの依存関係を拡張子「.d」のファイルとして出力 コンパイル完了後、実行ファイルを「smpl」として出力
出力ファイル(smpl.d)
生成ファイルは一つだけとなっており、ターゲットは「smpl」、前提条件が「func.c」に対応する内容となっている
(着色部はカレントディレクトリ内のファイル)
smpl: func.c /usr/include/stdc-predef.h func.h

その4

-MDオプション、-Eオプション、および-oオプションを指定して実行

対象ファイルにsample.c、func.cの2つを指定した場合
$ gcc -MD -E -o smpl sample.c func.c gcc: fatal error: cannot specify -o with -c, -S or -E with multiple files compilation terminated. $ ls -l total 16 -rw-r--r-- 1 ****** ******** 44 *** ** **:** func.c -rw-r--r-- 1 ****** ******** 74 *** ** **:** func.h -rw-r--r-- 1 ****** ******** 66 *** ** **:** sample.c -rw-r--r-- 1 ****** ******** 77 *** ** **:** sample.h $ ファイルが複数の場合に-c、-S、-Eと-oを一緒に指定できない事へのエラーメッセージ 実行は途中で停止

対象ファイルをsample.cのみとした場合
$ gcc -E -MD -o smpl sample.c $ ls -l total 24 -rw-r--r-- 1 ****** ******** 44 *** ** **:** func.c -rw-r--r-- 1 ****** ******** 74 *** ** **:** func.h -rw-r--r-- 1 ****** ******** 66 *** ** **:** sample.c -rw-r--r-- 1 ****** ******** 77 *** ** **:** sample.h -rw-r--r-- 1 ****** ******** 291 *** ** **:** smpl -rw-r--r-- 1 ****** ******** 62 *** ** **:** smpl.d $ ソースファイルの依存関係を拡張子「.d」のファイルとして出力 コンパイル完了後、実行ファイルを「smpl」として出力
出力ファイル(smpl.d)
(着色部はカレントディレクトリ内のファイル)
sample.o: sample.c /usr/include/stdc-predef.h sample.h func.h
出力ファイル(smpl)
# 1 "sample.c" # 1 "<built-in>" # 1 "<command-line>" # 31 "<command-line>" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 32 "<command-line>" 2 # 1 "sample.c" # 1 "sample.h" 1 # 1 "func.h" 1 void sampFunc(void); # 5 "sample.h" 2 # 2 "sample.c" 2 int main(void) { sampFunc(); return 0; }