linux下程序、動態庫、靜態庫內部添加版本號和編譯時間與Windows下Qt 如何給程序添加版本信息

給程序和庫添加版本號和庫,有利於維護和升級。

當然你可以在文件名上體現,比如有個程序叫 yun,文件名寫爲 yun_1.0.2,但這個需要每次手動維護,而且不能100%確保當前程序就是那個版本。所以,把版本號體現在程序內部,是一個不錯的選擇。

-----------------------------------  我是做法分割線 o  ------------------------------------

一、可執行程序

    程序內部定義版本宏,然後 main 函數通過 -v 參數,打印版本號和編譯時間,代碼如下:

    注:__DATE__(編譯日期), __TIME__(編譯時間),可參考這篇文章C語言中的預編譯宏定義

  

 1 #include <stdio.h>
 2 #include <string.h>
 3  
 4 #define VERSION    "0.0.2" // 此處每次發佈版本要手動更新
 5 #define NAME    "yun"
 6  
 7 static void show_info(char *argv[])
 8 {
 9     if (0 == strcmp("-v", argv[1]))
10     {
11         printf("%s version: %s (%s, %s)\n", NAME, VERSION, __DATE__, __TIME__);
12         return;
13     }
14     else if (0 == strcmp("-h", argv[1]))
15     {
16         printf("Usage: %s [options]\n", NAME);
17         printf("Options:\n");
18         printf("  void\tRun %s\n", NAME);
19         printf("  -v\tDisplay %s version information\n", NAME);
20         printf("  -h\tDisplay help information\n");
21         return;
22     }
23     
24     printf("Usage: %s [-v | -h]\n", NAME);
25     return;
26 }
27  
28 int main(int argc, char *argv[])
29 {
30     if (2 == argc)
31     {
32         show_info(argv);
33         return 0;
34     }
35  
36     printf("Can you feel me?\n");
37  
38     return 0;
39 }

運行效果:

 

 

二、動態庫、靜態庫

    庫不採用 -v 這種方法,因爲不是可執行程序。

    我們可以給程序添加一個版本號字符串,編譯成庫後使用 strings 命令查看,代碼如下:

/* add.h */

1 #ifndef _ADD_H_
2 #define _ADD_H_
3  
4 int add(int a, int b);
5  
6 #endif /* _ADD_H_ */

/* add.c */

1 #include "add.h"
2  
3 // 此處每次發佈版本要手動更新
4 const char *LIB_INFO = "libadd version: 0.0.3 (2015-01-30, 08:30)";
5  
6 int add(int a, int b)
7 {
8     return (a + b);
9 }

編譯及運行結果:
/* 靜態庫 */

 

/* 動態庫 */

說明:

strings 命令: 用於顯示文件中的可打印字符。

grep: 用於過濾無用信息,因爲自定義的庫信息包含 "version",所以就只顯示包含 "version" 的行,否則其他信息太多不好找。

此方法也可適用於可執行程序添加版本信息。

轉自:https://blog.csdn.net/a_ran/article/details/43275109

 

windows下的Qt程序添加版本信息方法如下

自己親手編譯過 Qt Creator 源碼的朋友都有這樣的疑惑,爲啥編譯完成後最終生成的動態庫、插件以及 exe 都會帶數字 4 後綴,下面記錄下如何出現以及如何解決

Aggregationd4.dll

一般我們在構建程序時一個簡單的工程 pro 是這樣的

TEMPLATE = app
TARGET = $$IDE_APP_TARGET
DESTDIR = $$IDE_BIN_PATH
QT = core
HEADER  += \
    ...
SOURCE  += \
    ...

這樣在執行 qmake 構建後最終生成的文件不會包含版本信息,我們來看下這個庫的信息

Aggregationd.dll信息

那麼如何才能加入版本信息呢?

其實很簡單,版本信息通常有兩種方法可以實現

  • 手動編寫 .rc文件
  • 自動生成.rc文件

手動編寫 .rc 文件方法比較繁瑣,直接找到某個模板修改即可,下面說說最簡單的自動生成方法

在 pro 文件添加版本定義變量

在你需要添加版本的工程 pro文件中添加下面這行代碼

VERSION = 4.4.1

然後重新構建,此時你會發現在工程臨時文件夾目錄多了一個文件

Aggregation_resource.rc

# if defined(UNDER_CE)
#  include <winbase.h>
# else
#  include <windows.h>
# endif
VS_VERSION_INFO VERSIONINFO
    FILEVERSION 4,4,1,0
    PRODUCTVERSION 4,4,1,0
    FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
    FILEFLAGS VS_FF_DEBUG
#else
    FILEFLAGS 0x0L
#endif
    FILEOS VOS__WINDOWS32
    FILETYPE VFT_DLL
    FILESUBTYPE 0x0L
    BEGIN
        BLOCK "StringFileInfo"
        BEGIN
            BLOCK "040904b0"
            BEGIN
                VALUE "CompanyName", "\0"
                VALUE "FileDescription", "\0"
                VALUE "FileVersion", "4.4.1.0\0"
                VALUE "LegalCopyright", "\0"
                VALUE "OriginalFilename", "Aggregation4.dll\0"
                VALUE "ProductName", "Aggregation\0"
                VALUE "ProductVersion", "4.4.1.0\0"
            END
        END
        BLOCK "VarFileInfo"
        BEGIN
            VALUE "Translation", 0x0409, 1200
        END
    END
/* End of Version info */

該文件描述了這個庫的版本等詳細信息,然後查看動態庫屬性,文件版本信息都已經寫進去了

Aggregationd.dll信息

好了,下面回到開始的問題,在編譯 Qt Creator 源碼後,爲啥生成的動態庫會包含數字 4 後綴,其實主要原因就是上述說的這個原因,qtcreator.pri 文件中定義了版本號變量,所以生成的庫名稱後面會追加數字4

Qt官方文檔說明

如何修改呢?其實知道的問題的原因後,修改起來也很簡單,主要有兩種方法

  • 刪除 pro文件中 VERSION 字段定義;
  • 手動編寫 .rc 文件,手動編寫後 qmake 不會給你自動生成,然後可以自定義名稱了;

轉自:https://www.cnblogs.com/kevinlq/p/14051877.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章