1

私は楽しみのために小さいCプログラムを書いています。変更に派手なIDEを使用しないための演習として、MinGW(Cのみ)、make、およびNotepad++を使用することにしました。これまでのところ、とても楽しくて楽しいです。

(MinGW ==私はWindowsで作業しています。)

プログラムはバニラCIに対してコンパイルされるので、完全に移植可能にすることを考えました。MinGW makeとgccは、ルールからプログラムを作成するのに十分賢いです。

myprog: myprog.o other.o
    $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@

明らかに、私はWindowsを使用しているので、コンパイラはを作成しますmyprog.exe。これは非常にスマートで、全体を非常にポータブルにします。

標準のターゲットに関してcleanは、実際にそのルールを使用しているので、少なくとも実装したいと思います。これで、Windowsで実際に機能するクリーンなターゲットは次のようになります。

clean:
   rm myprog.exe *.o

プログラムには拡張機能がないため、このルールはPOSIX環境では確実に機能しません。(PSOIX:GNU / Linuxだと思います)

あまり気にせずにクリーンを実装するポータブルな方法はありますか?

これまでのところ、この問題に関して本当に役立つドキュメントは見つかりませんでした。autoconfとautomakeがこの問題にどのように取り組んでいるかを見ると、パターンが導入されています@EXEEXT@。しかし、それは環境をテストする長い構成コードに依存しています。

4

2 に答える 2

1

バイナリ名を変数として定義します(オプションで、単純なegrepコマンドを使用して「main()」を定義するソースファイルの名前から推測します)。

EXE_EXT_LINUX:=
EXE_EXT_WINDOWS:=exe
EXE_EXT:=$(EXE_EXT_$(PLATF))

BINARY_NAME:=$(notdir $(basename $(shell egrep -r -l --include=*.cpp '^[ \t]*?int[ \t]*?main[ \t]*?\(') ) )$(EXE_EXT)

そして、ハードコードされた名前の代わりにこのマクロを使用してください

于 2012-04-05T08:18:44.627 に答える
1

次の方法で解決した場合:

UNAME = $(shell uname -o)
ifeq ($(UNAME), Msys)
  EXEEXT = .exe
endif

clean:
    rm *.o myprog$(EXEEXT)

それは問題を非常にうまく解決しました。完全に100%ポータブルというわけではありませんが、ほとんどの場合に機能します。

于 2012-05-22T08:06:28.230 に答える