5

C++ を使用して

自動化されたスケジュールでコードをコンパイルし、コード自体でコードがコンパイルされた時刻を使用する必要があります。現在、コンパイル時の日付と時刻を取得するため__DATE__にマクロを使用しています。__TIME__ただし、これにより、ソースに変更が加えられていない場合でもバイナリが変更されます (マクロはコンパイル時に膨張します)。これは良くありません (変更がない場合にバイナリが変更されたとセットアップに認識させたくありません)。ソースに)。

ソースを変更する手段を使用せずにコンパイル時間を取得することは可能ですか?

ありがとう

4

3 に答える 3

3

標準__DATE____TIME__マクロは、観察したことを実行し、時間依存の文字列を返します。

これは、システム (およびおそらくコンパイラ) と、特にビルド システム (GNU makeなど)に依存します。

make考えられるアイデアは、(構文で)のような別のタイムスタンプファイルにリンクすることです

timestamp.c:
        date +'const char timestamp[]="%c";' > $@

program: $(OBJECTS) timestamp.c
        $(LINKER.cc) $^ -o $@ $(LIBES)
        rm -f timestamp.c

次にtimestamp.o、が再生成さprogramれ、毎回再リンクされますmake(したがって、生成されたプログラムは実際に変更されますが、ほとんどのコード($(OBJECTS)変数を作成する)は変更されません)。


または、たとえば、データベースまたはテキストログファイル内にリンクの時間を記録することもできます。

program: $(OBJECTS)
      $(LINKER.cc) $^ -o $@ $(LIBES)
      date +'$@ built at %c' >> /var/log/build.log

(syslogに記録するlogger代わりに使用できます)date

その後、生成されprogramたものは変更されませんが、ビルドのタイムスタンプがどこかに記録されます。$(shell md5sum program)ところで、makeバイナリ プログラムのチェックサム (構文など) もログに記録できます。

于 2013-07-12T10:35:10.363 に答える
0

あなたが何を望んでいるのか、私にははっきりしません。それがファイルの最終変更時刻である場合、それを取得するのはシステムとビルド システムによって異なります-D $(shell ls -l --time-style=long-iso $< | awk '{ print $7, $8 }')。たとえば、Linux で GNU make を使用してコンパイラを呼び出すときに、次のようなものを使用できます。しかしもちろん、ソースではなくインクルード ファイルが変更された場合、時刻と日付にはそれが反映されないことを意味します。

于 2013-07-12T11:40:16.060 に答える
0

バイナリでコンパイル時を使用すると、バイナリが変更されます。

いくつかの解決策がありますが、主なポイントは、バイナリを定期的に再構築する場合、実際には (ビルド システムまたはソース コードのいずれかに) 何らかの変更がある場合にのみ実行する必要があるということです。したがって、ビルド システムの一部にして、変更があるかどうかを確認し、変更がない場合は何もビルドしないでください。これを行う簡単な方法は、ソース コードのバージョン管理システムで「最新バージョン」が何であるかを確認することです。最新バージョンが以前のビルドで使用されたものと同じである場合、何もビルドする必要はありません。これにより、(ビルドのタイムスタンプを除いて) 同一のビルドを生成する手間が省け、storgin__DATE____TIME__バイナリの問題が解決されます。

于 2013-07-12T11:05:43.870 に答える