a.exeの代わりに常にコードファイル名で出力するようにgccを設定できますか?

a.exeの代わりに常にコードファイル名で出力するようにgccを設定できますか?

デフォルトでは、実行時にgcc test.cgccは実行可能ファイルをa.exe.gccから生成できるようにグローバルにオーバーライドする方法はありますかtest.exe

これは、入力ファイルが1つしかないと仮定します。それ以外の場合、gccはa.exeまたは最初のファイル名を使用することを選択できます。

答え1

これは通常、 makefile ルールによって行われます。たとえばtest.c、与えられた場合でもこれを行うことができます。いいえメイクファイルがあります):

make test

同様に、g ++にもtest2.cc同じことができるという前提のもとに、事前定義された規則があります。

make test2

ただし、どちらの場合もライブラリが必要になります。これにはmakefileの利点があります(複数のオブジェクトをコンパイルする方法を提供することに加えて)。

gcc自体には、makefileルールをエミュレートするオプションはありません。これを実行できるツールが必要な場合は、上記の特別なケースを実行するシェルスクリプトを作成できます。

#!/bin/sh
for name in "$@"
do
    case "$name" in
    *.c)
        gcc -o $(basename "$name") "$name"
        ;;
    *.cc)
        g++ -o $(basename "$name") "$name"
        ;;
    *)
        echo "ignoring $name, since it is not one of my files!"
        ;;
    esac
done

ただし、(答えの冒頭を参照)、スクリプトは事前定義された規則が提供する内容を明確にしますmake。一方、あなたはできるスクリプトを変更して必要なライブラリを追加し、1つの場所でこれを実行します(問題のように見えるmakefileセットの代わりに)。

注:gccが自動的に「.exe」サフィックスを提供するかどうか(そうでない場合)は、プラットフォームとコンパイラの設定によって異なります。このサフィックスはUnixファミリープラットフォームでは有用ではなく、通常Cygwinなどの関連プラットフォームではオプションです。

答え2

gccでバイナリを生成し、デフォルトのコンパイルされた.cファイルの名前を使用する方法を見つけることができません。しかし、gccの代わりに実行するように作成したクイックbashスクリプトは次のとおりです。

#!/bin/bash
temp=${1##*/}; output=${temp%.c}
gcc $1 -o $output $2

関係なく、デフォルトで名前でコンパイルし、ファイルがある場合は、バイナリを実行するようにスクリプトを拡張しました。私はこれがよりよく調整され、常にその名前のファイルがあるかのように実行されると確信していますが、それは私の目的に適しています。

#!/bin/bash

temp=${1##*/}; output=${temp%.c}

gcc $1 -o $output $2

if [ -f $output ]; then
    echo "==== $output being run ===="
    ./$output
fi

関連情報