linux 程序、动态库、静态库内部添加版本号和编译时间详解
<p>给程序和库添加版本号和库,有利于维护和升级。</p>
<p>
当然你可以在文件名上体现,比如有个程序叫 yun,文件名写为 yun_1.0.2,但这个需要每次手动维护,而且不能100%确保当前程序就是那个版本。所以,把版本号体现在程序内部,是一个不错的选择。</p>
<p>
<span><strong>----------------------------- 我是做法分割线 -------------------------------</strong></span></p>
<p>
<span><strong>一、可执行程序</strong></span></p>
<p>
程序内部定义版本宏,然后 main 函数通过 -v 参数,打印版本号和编译时间,代码如下:</p>
<p>
注:__date__(编译日期), __time__(编译时间)</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterxhtml" id="highlighter_868077">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
<div class="line number23 index22 alt2">
23</div>
<div class="line number24 index23 alt1">
24</div>
<div class="line number25 index24 alt2">
25</div>
<div class="line number26 index25 alt1">
26</div>
<div class="line number27 index26 alt2">
27</div>
<div class="line number28 index27 alt1">
28</div>
<div class="line number29 index28 alt2">
29</div>
<div class="line number30 index29 alt1">
30</div>
<div class="line number31 index30 alt2">
31</div>
<div class="line number32 index31 alt1">
32</div>
<div class="line number33 index32 alt2">
33</div>
<div class="line number34 index33 alt1">
34</div>
<div class="line number35 index34 alt2">
35</div>
<div class="line number36 index35 alt1">
36</div>
<div class="line number37 index36 alt2">
37</div>
<div class="line number38 index37 alt1">
38</div>
<div class="line number39 index38 alt2">
39</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">stdio.h</code><code class="xhtml plain">></code>
</div>
<div class="line number2 index1 alt1">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">string.h</code><code class="xhtml plain">></code>
</div>
<div class="line number3 index2 alt2">
</div>
<div class="line number4 index3 alt1">
<code class="xhtml plain">#define version "0.0.2" // 此处每次发布版本要手动更新</code>
</div>
<div class="line number5 index4 alt2">
<code class="xhtml plain">#define name "yun"</code>
</div>
<div class="line number6 index5 alt1">
</div>
<div class="line number7 index6 alt2">
<code class="xhtml plain">static void show_info(char *argv[])</code>
</div>
<div class="line number8 index7 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number9 index8 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">if (0 == strcmp("-v", argv))</code>
</div>
<div class="line number10 index9 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">{</code>
</div>
<div class="line number11 index10 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">printf("%s version: %s (%s, %s)\n", name, version, __date__, __time__);</code>
</div>
<div class="line number12 index11 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">return;</code>
</div>
<div class="line number13 index12 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">}</code>
</div>
<div class="line number14 index13 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">else if (0 == strcmp("-h", argv))</code>
</div>
<div class="line number15 index14 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">{</code>
</div>
<div class="line number16 index15 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">printf("usage: %s \n", name);</code>
</div>
<div class="line number17 index16 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">printf("options:\n");</code>
</div>
<div class="line number18 index17 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">printf(" void\trun %s\n", name);</code>
</div>
<div class="line number19 index18 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">printf(" -v\tdisplay %s version information\n", name);</code>
</div>
<div class="line number20 index19 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">printf(" -h\tdisplay help information\n");</code>
</div>
<div class="line number21 index20 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">return;</code>
</div>
<div class="line number22 index21 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">}</code>
</div>
<div class="line number23 index22 alt2">
<code class="xhtml spaces"> </code>
</div>
<div class="line number24 index23 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">printf("usage: %s [-v | -h]\n", name);</code>
</div>
<div class="line number25 index24 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">return;</code>
</div>
<div class="line number26 index25 alt1">
<code class="xhtml plain">}</code>
</div>
<div class="line number27 index26 alt2">
</div>
<div class="line number28 index27 alt1">
<code class="xhtml plain">int main(int argc, char *argv[])</code>
</div>
<div class="line number29 index28 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number30 index29 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">if (2 == argc)</code>
</div>
<div class="line number31 index30 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">{</code>
</div>
<div class="line number32 index31 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">show_info(argv);</code>
</div>
<div class="line number33 index32 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">return 0;</code>
</div>
<div class="line number34 index33 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">}</code>
</div>
<div class="line number35 index34 alt2">
</div>
<div class="line number36 index35 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">printf("can you feel me?\n");</code>
</div>
<div class="line number37 index36 alt2">
</div>
<div class="line number38 index37 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">return 0;</code>
</div>
<div class="line number39 index38 alt2">
<code class="xhtml plain">}</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
<strong>运行效果:</strong></p>
<p>
<img title="linux 程序、动态库、静态库内部添加版本号和编译时间详解" alt="linux 程序、动态库、静态库内部添加版本号和编译时间详解" src="https://zhuji.jb51.net/uploads/img/202305/0b4d2a8499f444eace01204b8af60a5d.jpg"></p>
<p>
<span><strong>二、动态库、静态库</strong></span></p>
<p>
<span>库不采用 -v 这种方法,因为不是可执行程序。</span></p>
<p>
<span>我们可以给程序添加一个版本号字符串,编译成库后使用 strings 命令查看,代码如下:</span></p>
<p>
<span>/* add.h */</span></p>
<pre class="cpp prettyprint linenums" code_snippet_id="593124" name="code" snippet_file_name="blog_20150130_2_1497802">
#ifndef _add_h_#define _add_h_int add(int a, int b);#endif /* _add_h_ */</pre>
<p>
<span><span>/* add.c */</span></span></p>
<pre class="cpp prettyprint linenums" code_snippet_id="593124" name="code" snippet_file_name="blog_20150130_3_2987374">
#include "add.h"// 此处每次发布版本要手动更新const char *lib_info = "libadd version: 0.0.3 (2015-01-30, 08:30)";int add(int a, int b){return (a + b);}</pre>
<p>
<strong>编译及运行结果:</strong></p>
<p>
/* 静态库 */</p>
<p>
<img title="linux 程序、动态库、静态库内部添加版本号和编译时间详解" alt="linux 程序、动态库、静态库内部添加版本号和编译时间详解" src="https://zhuji.jb51.net/uploads/img/202305/715f9a5391656e356795acd042b2a771.jpg"></p>
<p>
<span>/* 动态库 */</span></p>
<p>
<img title="linux 程序、动态库、静态库内部添加版本号和编译时间详解" alt="linux 程序、动态库、静态库内部添加版本号和编译时间详解" src="https://zhuji.jb51.net/uploads/img/202305/9f3af421774de1919ed3dfd6ccf1a869.jpg"></p>
<p>
<strong>说明:</strong></p>
<p>
<span><strong>strings</strong> 命令: 用于显示文件中的可打印字符。</span></p>
<p>
<span><strong>grep</strong>: 用于过滤无用信息,因为自定义的库信息包含 "version",所以就只显示包含 "version" 的行,否则其他信息太多不好找。</span></p>
<p>
<span>此方法也可适用于<strong>可执行程序</strong>添加版本信息。</span></p>
頁:
[1]