GNU/Linux >> Linux の 問題 >  >> Linux

バージョン情報を共有ライブラリとバイナリに埋め込む方法は?

@cdunn2001 が言及した「$Id:$」の問題を回避しながら、@sashang の回答を拡張するには ...

プロジェクトに「version_info.h」というファイルを追加できます。このファイルには次のものしかありません:

#define VERSION_MAJOR "1"
#define VERSION_MINOR "0"
#define VERSION_PATCH "0"
#define VERSION_BUILD "0"

main.c ファイルには次の行があります:

static char version[] = VERSION_MAJOR "." VERSION_MINOR "." VERSION_PATCH "." VERSION_BUILD;
static char timestamp[] = __DATE__ " " __TIME__;

(または、これらの値をプログラムで使用したい場合)

次に、version_info.h ファイルを読み取り、適切に数値を上げて、再度書き戻すビルド前のステップを設定します。デイリー ビルドでは VERSION_BUILD の数値が上がるだけですが、より深刻なリリースでは他の数値が上がります。

Makefile でオブジェクトの前提条件リストにこれがリストされている場合、ビルドは必要なものを再コンパイルします。


インテル Fortran および C++ コンパイラーは確かにこれを行うことができます。-sox を使用してください。 オプション。はい、方法はあります。私は、そのような情報をバイナリに埋め込むための広く普及している規則を知りません。私は通常、埋め込まれた情報を読み取るために Emacs を 16 進モードで使用しますが、これは非常にハックです。

「-sox」は、実行可能ファイルのビルドに使用されるコンパイラ オプションも埋め込みます。これは非常に便利です。


cvs または subversion を使用している場合の 1 つの方法は、ソース ファイルで特別にフォーマットされた特別な ID 文字列を使用することです。次に、変更がコミットされたときにその特殊変数をファイルの新しいバージョンで更新する pre-commit フックを cvs または svn に追加します。次に、バイナリがビルドされたら、ident を使用してその情報を抽出できます。例:

次のようなものを cpp ファイルに追加してください:

static char fileid[] = "$Id: fname.cc,v 1.124 2010/07/21 06:38:45 author Exp $";

プログラムで ident (rcs をインストールすると見つかります) を実行すると、id 文字列を含むファイルに関する情報が表示されます。

ident program
program:
    $Id: fname.cc,v 1.124 2010/07/21 06:38:45 author Exp $

注意 人々がコメントで言及しているように、この手法は古風です。ソース管理システムがソース コードを自動的に変更するのは見苦しいものであり、cvs が唯一の選択肢だった時代からソース管理が改善されているという事実は、同じ目標を達成するためのより良い方法を見つけることができることを意味します.


Linux
  1. 別のファイルに書き込む方法は?

  2. Bashに入力されたすべてのコマンドとすべてのファイル操作をログに記録する方法は?

  3. すべてのRhythmbox設定とライブラリ情報をリセットする方法は?

  1. libstdc++.so.5:共有オブジェクト ファイルを開けません - ただし、ライブラリはインストールされており、最新です

  2. スレッドとファイル記述子

  3. Linux で共有ライブラリのバージョン管理を行う方法は?

  1. VSFTPDをインストールして構成する方法

  2. OSとLinuxのバージョンを確認する方法

  3. `^ m`そしてそれを取り除く方法は?