web-dev-qa-db-ja.com

C実行可能ファイル名の決定

Cプログラムをコンパイルするとき、出力はa.outに保存されます。コンパイル済みの出力を別のファイルにリダイレクトするにはどうすればよいですか?

33
arun

ほとんどのCコンパイラは-oこのオプション:

gcc -o gentext gentext.c
cc  -o mainprog -Llib -lmymath firstbit.c secondbit.o
xlc -o coredump coredump.c
33
paxdiablo

-ofilenameは、a.outの代わりにfilenameを作成します。

19
Daniel A. White

マニュアルによると:

-o <file>  Place the output into <file>
9
Arkaitz Jimenez

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関数を含むファイルに基づいて付けられているかどうかについて固い習慣はありません。

4
user25148

_-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 $@
_

さらに情報が必要な場合はお知らせください。

2
Francesco Boi

fooが実行可能ファイルであり、bar.cはソースファイルで、コマンドは次のとおりです。

gcc -o foo bar.c
1
Albert Davies

次を使用してコンパイルします。

cc -o <opfilename> <filename.c>

次を使用して実行します。

./<opfilename>
1
KJ Sudarshan