说给奶奶听 發表於 2024-3-3 00:00:00

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 &lt;</code><code class="xhtml keyword">stdio.h</code><code class="xhtml plain">&gt;</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="xhtml plain">#include &lt;</code><code class="xhtml keyword">string.h</code><code class="xhtml plain">&gt;</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]
查看完整版本: linux 程序、动态库、静态库内部添加版本号和编译时间详解