我怎么能存储在其Linux版本的静态库版本号(file.a),后来检查?
PS我需要检查文件的版本,任何时候不只是使用shell实用程序的任何特殊可执行可能性。
我怎么能存储在其Linux版本的静态库版本号(file.a),后来检查?
PS我需要检查文件的版本,任何时候不只是使用shell实用程序的任何特殊可执行可能性。
也许你可以创建一个版本是这样的字符串:
char* library_version = { "Version: 1.3.6" };
并能够从外壳检查它只需使用:
strings library.a | grep Version | cut -d " " -f 2
除了由Puppe提到提供静态字符串,通常的做法是提供一个宏来检索兼容的版本检查。 例如,你可以有以下的宏(在头文件中声明与您的库中使用):
#define MYLIB_MAJOR_VERSION 1
#define MYLIB_MINOR_VERSION 2
#define MYLIB_REVISION 3
#define MYLIB_VERSION "1.2.3"
#define MYLIB_VERSION_CHECK(maj, min) ((maj==MYLIB_MAJOR_VERSION) && (min<=MYLIB_MINOR_VERSION))
该通知MYLIB_CHECK_VERSION
宏,我假设你想有一个具体的重大转和次要转大于或等于所需的版本。 为您的应用需要改变。
然后从一个调用应用程序使用它,是这样的:
if (! MYLIB_VERSION_CHECK(1, 2)) {
fprintf(stderr, "ERROR: incompatible library version\n");
exit(-1);
}
这种做法将导致版本信息来自于包含的头文件。 此外,它将在编译时调用的应用程序进行优化。 随着一点点更多的工作,你可以从库本身提取出来。 阅读...
您也可以使用这些信息来创建存储你的库中的静态字符串,如Puppe提及。 将这样的事情您的库中:
struct {
const char* string;
const unsigned major;
const unsigned minor;
const unsigned revision;
} mylib_version = {
MYLIB_VERSION, MYLIB_MAJOR_VERSION, MYLIB_MINOR_VERSION, MYLIB_REVISION
};
这将创建一个名为结构mylib_version
在您的图书馆。 您可以使用此您的图书馆内创建函数和调用应用程序访问这些,等做进一步的核查
创建基于您的编辑一个新的答案......只是为了避免混淆:)
如果你正在寻找一个非代码的方式来解决这个问题,你可以试试这个。 这是(再一次)到另一种strings
的方式通过Puppe定义。
也许你可以只需轻触一个名为version_1.2.3
并将其添加到存档。 然后,你可以通过查找使用ar命令的版本文件确定版本:
ar t libmylib.a | grep 'version_' | sed -e 's/^version_//'
我不知道是否会得到你所需要的,但在归档中嵌入这样的元数据的标准方法。 也许你会找到你想要在这个“图元文件”适用于归档存储的其他信息。
有好几次man 1 ident
已经提及,所以这里是有关使用方法的细节。
ident
是自带的RCS(版本控制系统)的命令,但也可能是可用的,如果你正在使用CVS(并行版本系统),或颠覆。
你会使用这样的(从该名男子页克隆):
#include <stdio.h>
static char const rcsid[] =
"$Id: f.c,v 5.4 1993/11/09 17:40:15 eggert Exp $";
int main() { return printf("%s\n", rcsid) == EOF; }
和fc被编译成FO,则命令
ident f.c f.o
将输出
f.c:
$Id: f.c,v 5.4 1993/11/09 17:40:15 eggert Exp $
f.o:
$Id: f.c,v 5.4 1993/11/09 17:40:15 eggert Exp $
如果您的fo
加入到静态库fa
那么ident fa
应该表现出相似的输出。 如果你有几个类似的建[az].o
在az.a
你应该找到自己的所有字符串az.a
文件。
警告:正因为他们是在某文件并不意味着他们将被包含在你的程序文件。 除非程序引用它们的链接认为没有必要,包括他们。 所以,你通常必须有每个模块中的方法返回字符串,并且应用程序需要调用该方法。 有办法说服大部分链接器,这是不实际引用它所需的符号,但它依赖于连接器和超出这个答案的范围。
相反,如果你熟悉的SCCS(源代码控制系统),那么你将使用man 1 what
,而是和它看起来像这样(用宏做展示的灵活性提供):
#include <stdio.h>
#define VERSION_STR "5.4"
#define CONFIG "EXP"
#define AUTHOR "eggert"
static char const sccsid[] =
"@(#) " CONFIG " v " VERSION_STR " " __DATE__ " " __TIME__ " " AUTHOR;
int main() { return printf("%s\n", sccsid) == EOF; }
和fc被编译成FO,则命令
what f.c f.o
将输出
f.c:
@(#) EXP v 5.4 1993/11/09 17:40:15 eggert
f.o:
@(#) EXP v 5.4 1993/11/09 17:40:15 eggert
PS:这两个ident
和what
是来与特定的集中式源代码控制系统的命令。 如果您正在使用分布式源代码控制系统(如Git)的整个概念是没有意义。 对于使用一些想法git
看到这个线程: 移动从CVS到混帐:$ ID:$相当于? 虽然哈希是不一样的版本号。 :)
如果你正在使用gcc,你可以使用#ident伪指令
#ident "Foo Version 1.2.3.4"
void foo(void){ /* foo code here */ }
要获得版本只使用下列之一:
strings -a foo.o | grep "Foo Version"
strings -a foo.a | grep "Foo Version"
strings -a foo.so | grep "Foo Version"
这将允许您编译版本到库的使用后剥离出来的能力strip -R .comment your_file
或传递完全忽略它-fno-ident
(这也将省略从编译对象的编译器版本注释)