**:
很多程式設計師都遇到過這樣的問題:已經上線執行很長時間的系統出了問題,並且其中的很多程式經過了多次的修改和公升級,日誌中的資訊和現有的程式完全對不上號!怎樣才能檢視程式的資訊(例如版本號、編譯的時間等)、以確定程式的確切版本呢?很多的版本管理工具(例如cvs、svn)可以幫你管理原始碼的版本,但並不會在編譯的時候把編譯資訊寫到二進位制執行碼中去。因此,還是要通過其他手段來實現。
在這裡我提供了一種在可執行程式中寫入編譯資訊的辦法,希望對大家有幫助。
這個例子由兩個程式構成:test.c、version.c。其中version.c用於實現編譯資訊的記錄,只要在現有的**中加入該程式,而不需要對已有**作任何的修改,就能實現二進位制執行碼的版本資訊管理。
version.c
#include
/* 以下兩個巨集用於在編譯時通過巨集定義傳入編譯資訊
version被替換為const char version=」resivion: ***x」
buildtime被替換為 const char buildtime=」buildtime: yyyymmdd」
*/version;
buildtime;
void print_version()
void print_buildtime()
print_version()和print_buildtime()這兩個函式不是必須的,只是讓version.c看起來「更象個程式」,同時可以提供在外部程式中輸出編譯資訊的手段。
test.c
#include
int main()
在test.c中呼叫這兩個函式只是用於測試,正式版本的程式中可以用實際的**替換。
在makefile中新增以下的內容:
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) $<
如果你使用了版本管理工具,可以通過工具動態讀取版本(或修訂)資訊,將資訊賦值給version變數。你完全可以自己定義巨集定義的格式,例如將編譯的精確時間寫進去。
編譯後執行:
$testversion
revision: 1.2.2
buildtime: 20100402
$通過strings命令檢視:
$string testversion | grep revision
revision: 1.2.2
$strings testversion | grep buildtime
buildtime: 20100402
這個結果是我真正希望的!只要通過檢視二進位制執行碼中的字串,就可以確定程式的版本了!
二進位制檔案寫入
被二進位制檔案寫入困擾了2天之後終於寫出來 先把 貼上,明天補說明 imports system imports system.io imports system.text imports microsoft.visualbasic public sub a1 byval mystr as stri...
操作二進位制寫入二進
操作二進位制 寫入二進位制 1 宣告變數 sqlite3 stmt stat 2 把sql語句解析到stat結構中去 sqlite3 prepare 3 繫結替換 sqlite3 bind blob 4 儲存到資料庫 int result sqlite3 step 5 釋放stat結構 sqlite...
二進位製碼轉BCD碼
在微控制器裡面,如 顯示個溫度值,這時,要取乙個數的個位 十位 百位,可以用 和 求商和求餘 來解決。但是,在fpga裡面用求商和求餘將會非常消耗資源,這樣就必須用到二進位制轉bcd碼了,這裡介紹一種簡單的加3移位演算法。注 b代表二進位制,d代表十進位制,0x代表十六進製制,bcd 為bcd 碼,...