- 論壇徽章:
- 0
|
本帖最后由 sunlan 于 2010-04-02 16:14 編輯
很多程序員都遇到過這樣的問題:已經(jīng)上線運行很長時間的系統(tǒng)出了問題,并且其中的很多程序經(jīng)過了多次的修改和升級,日志中的信息和現(xiàn)有的程序完全對不上號!怎樣才能查看程序的信息(例如版本號、編譯的時間等)、以確定程序的確切版本呢?很多的版本管理工具(例如CVS、SVN)可以幫你管理源碼的版本,但并不會在編譯的時候把編譯信息寫到二進制執(zhí)行碼中去。因此,還是要通過其他手段來實現(xiàn)。
在這里我提供了一種在可執(zhí)行程序中寫入編譯信息的辦法,希望對大家有幫助。
這個例子由兩個程序構成:test.c、version.c。其中version.c用于實現(xiàn)編譯信息的記錄,只要在現(xiàn)有的代碼中加入該程序,而不需要對已有代碼作任何的修改,就能實現(xiàn)二進制執(zhí)行碼的版本信息管理。
version.c
- #include <stdio.h>
- /* 以下兩個宏用于在編譯時通過宏定義傳入編譯信息
- VERSION被替換為const char version[]=”Resivion: xxxx”
- BUILDTIME被替換為 const char buildtime[]=”Buildtime: yyyymmdd”
- */
- VERSION;
- BUILDTIME;
- void print_version()
- {
- printf( “%s\n”, version );
- }
- void print_buildtime()
- {
- printf( “%s\n”, buildtime );
- }
復制代碼 print_version()和print_buildtime()這兩個函數(shù)不是必須的,只是讓version.c看起來“更象個程序”,同時可以提供在外部程序中輸出編譯信息的手段。
test.c
- #include <stdio.h>
- int main()
- {
- print_version();
- print_buildtime();
- }
復制代碼 在test.c中調(diào)用這兩個函數(shù)只是用于測試,正式版本的程序中可以用實際的代碼替換。
在Makefile中添加以下的內(nèi)容:
- version="const char version[]=\"Revision: 1.2.2\""
- buildtime="const char buildtime[]=\"Buildtime: `date +%Y%m%d`\""
- CFLAGS=-c –g –DVERSION=”$version” –DBUILDTIME=”$buildtime”
- testversion: test.o version.o
- cc –o $@ $?
- .c.o :
- $(CC) $(CFLAGS) $<
復制代碼 如果你使用了版本管理工具,可以通過工具動態(tài)讀取版本(或修訂)信息,將信息賦值給version變量。你完全可以自己定義宏定義的格式,例如將編譯的精確時間寫進去。
編譯后執(zhí)行:
- $testversion
- Revision: 1.2.2
- Buildtime: 20100402
- $
復制代碼 通過strings命令查看:
- $string testversion | grep Revision
- Revision: 1.2.2
- $strings testversion | grep Buildtime
- Buildtime: 20100402
復制代碼 這個結果是我真正希望的!只要通過查看二進制執(zhí)行碼中的字符串,就可以確定程序的版本了! |
|