如何在静态库中存储版本号?

Pir*_*rks 8 c linux static-libraries

如何在静态库(file.a)中存储版本号,然后在Linux中检查其版本?

PS我需要有可能随时检查文件的版本,没有任何特殊的可执行文件只使用shell实用程序.

jhe*_*ngs 10

除了提供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))
Run Code Online (Sandbox Code Playgroud)

注意MYLIB_CHECK_VERSION宏,我假设你想要一个特定的主要转速和一个小于或等于你想要的版本的小转速.根据您的申请需要进行更改.

然后在调用应用程序中使用它,例如:

if (! MYLIB_VERSION_CHECK(1, 2)) {
    fprintf(stderr, "ERROR: incompatible library version\n");
    exit(-1);
}
Run Code Online (Sandbox Code Playgroud)

此方法将导致版本信息来自包含的头文件.此外,它将在编译时针对调用应用程序进行优化.通过更多工作,您可以从库本身中提取它.继续阅读......

您也可以使用此信息创建存储在库中的静态字符串,如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
};
Run Code Online (Sandbox Code Playgroud)

这将创建一个mylib_version在库中调用的结构.您可以通过在库中创建函数并从调用应用程序等访问这些函数来使用它来进行进一步的验证.

  • 我看到MYLIB_VERSION_CHECK的唯一问题是它在编译时被评估,如果一切正常,一个好的优化器会删除检查,并且无条件地调用printf() - 你的意思是fprintf(stderr,...)不是吗? - 并退出().我认为调用嵌入逻辑的函数而不是使用常量表达式会更好. (2认同)

Pup*_*ppe 9

也许你可以用这样的版本创建一个字符串:

char* library_version = { "Version: 1.3.6" };
Run Code Online (Sandbox Code Playgroud)

并且能够从shell检查它只需使用:

strings library.a | grep Version | cut -d " " -f 2
Run Code Online (Sandbox Code Playgroud)