Cプログラムをコンパイルするとき、出力はa.outに保存されます。コンパイル済みの出力を別のファイルにリダイレクトするにはどうすればよいですか?
ほとんどのCコンパイラは-o
このオプション:
gcc -o gentext gentext.c
cc -o mainprog -Llib -lmymath firstbit.c secondbit.o
xlc -o coredump coredump.c
-ofilename
は、a.out
の代わりにfilename
を作成します。
マニュアルによると:
-o <file> Place the output into <file>
Cの起源であるUnixでは、通常、Cプログラムはモジュールごとにコンパイルされ、コンパイルされたモジュールは実行可能ファイルにリンクされます。モジュールで構成されるプロジェクトの場合foo.c
およびbar.c
、コマンドは次のようになります。
cc -c foo.c
cc -c bar.c
cc -o myprog foo.o bar.o
(-cを使用すると、出力ファイル名は、拡張子が.oに置き換えられたソースファイルになります。)
これにより、変更されたモジュールのみを再コンパイルすることもできます。これは、大きなプログラムでは時間を大幅に節約できますが、かなり注意が必要になる場合もあります。 (この部分は通常make
を使用して自動化されます。)
単一モジュールのプログラムの場合、最初に.oファイルにコンパイルしてからリンクしても実際には意味がないので、単一のコマンドで十分です。
cc -o foo foo.c
単一モジュールのプログラムでは、結果の実行可能プログラムを、.c接尾辞なしのCソースファイルと同じように呼び出すのが一般的です。マルチモジュールプログラムの場合、出力の名前がmain関数を含むファイルに基づいて付けられているかどうかについて固い習慣はありません。
_-o
_オプションを使用します。
_gcc main.c -o myCoolExecutable.o
_
プログラムが単一のファイルで構成されている場合、これは問題ありません。さらにファイルがある場合は、make
を使用することをお勧めします。Makefile
を作成してから、コマンドmake
を実行します。
Makefile
は、コンパイルの規則を含むファイルです。例は次のとおりです(_#
_は行がコメントであることを意味します):
_CXX = gcc
#CXXFLAGS = -std=c++11
#INC_PATH = ...
#LIBS = ...
SOURCEDIR := yourSourceFolder
SOURCES := $(wildcard $(SOURCEDIR)/*.c)
OBJDIR=$(SOURCEDIR)/obj
OBJECTS := $(patsubst $(SOURCEDIR)/%.c,$(OBJDIR)/%.o, $(SOURCES))
DEPENDS := $(patsubst $(SOURCEDIR)/%.c,$(OBJDIR)/%.d, $(SOURCES))
# ADD MORE WARNINGS!
WARNING := -Wall -Wextra
# .PHONY means these rules get executed even if
# files of those names exist.
.PHONY: all clean
# The first rule is the default, ie. "make",
# "make all" and "make parking" mean the same
all: yourExecutableName
clean:
$(RM) $(OBJECTS) $(DEPENDS) yourExecutableName
# Linking the executable from the object files
# $^ # "src.c src.h" (all prerequisites)
yourExecutableName: $(OBJECTS)
$(CXX) $(WARNING) $^ -o $@
#$(CXX) $(WARNING) $(CXXFLAGS) $(INC_PATH) $^ -o $@ $(LIBS)
-include $(DEPENDS)
$(OBJDIR):
mkdir -p $(OBJDIR)
$(OBJDIR)/%.o: $(SOURCEDIR)/%.c Makefile | $(OBJDIR)
$(CXX) $(WARNING) -MMD -MP -c $< -o $@
_
まもなくCXX
変数がコンパイラ(gcc、g ++)を定義し、_with CXXFLAGS
_コンパイル用のフラグを定義できます(つまり_-std=c++11
_)。次に、カスタム(_INC_PATH
_およびLIBS
:この例では設定されていません)を含めて定義できます。 SOURCEDIR
を使用すると、ソースコードディレクトリ(_*.c
_ファイルがある)を指定できます。その後、SOURCES
は、コンパイルのソースファイルはすべて拡張子_*.c
_。
Makefile
には、次の構造を持つ一連のルールが含まれます。
_output: inputs
commandToExecute
_
実行可能ファイルを生成するルールは
_yourExecutableName: $(OBJECTS)
$(CXX) $(WARNING) $^ -o $@
_
これはgcc -Wall -Wextra $(OBJECTS) -o yourExecutableName
と同等です。
$(OBJECTS)
は、コンパイルの結果のオブジェクトファイルです。上記のルールが実行されたときに、それらが見つからない場合、makeはファイルのスキャンを続けてそれらを生成するルールを見つけます。この場合、これらのファイルを生成するルールは次のとおりです。
_$(OBJDIR)/%.o: $(SOURCEDIR)/%.c Makefile | $(OBJDIR)
$(CXX) $(WARNING) -MMD -MP -c $< -o $@
_
さらに情報が必要な場合はお知らせください。
foo
が実行可能ファイルであり、bar.c
はソースファイルで、コマンドは次のとおりです。
gcc -o foo bar.c
次を使用してコンパイルします。
cc -o <opfilename> <filename.c>
次を使用して実行します。
./<opfilename>