将库版本编译成.so文件

标签 c gcc versioning shared-libraries

我有一个 C linux API 库,我将其分发给最终用户和服务器。当用户需要使用这个库时,他们会编译并构建一个 .so 文件,并将其发送到我们的服务器来运行。我想要一种将库的版本号编译到其 .so 文件中的方法,以便我的服务器可以检查它们编译的版本。这样如果服务器与用户的.so文件不兼容,我可以拒绝加载该库。我不确定我什至需要什么选择来实现这一目标,并希望得到任何类型的建议。如果有更多信息有助于解决此问题,请告诉我。

最佳答案

库通常有一个 getLibraryVersion 函数,该函数返回一些常量值,无论是字符串、整数还是其他值。这将为您提供链接的版本(即您的 .so 版本)。您可以有一个额外的宏来获取您编译的版本(即您的服务器版本)。

例如,SDL 的 API 有一个版本结构,并在其 header 之一中定义了以下函数:

#define SDL_MAJOR_VERSION   1
#define SDL_MINOR_VERSION   2
#define SDL_PATCHLEVEL      15

typedef struct SDL_version {
    Uint8 major;
    Uint8 minor;
    Uint8 patch;
} SDL_version;

/**
 * This macro can be used to fill a version structure with the compile-time
 * version of the SDL library.
 */
#define SDL_VERSION(X)              \
{                                   \
    (X)->major = SDL_MAJOR_VERSION; \
    (X)->minor = SDL_MINOR_VERSION; \
    (X)->patch = SDL_PATCHLEVEL;    \
}

/**
 * Use this function to get the version of SDL that is linked against
 * your program.
 */
extern void SDL_GetVersion(SDL_version* ver);

在您的 .so.c 文件之一中:

void SDL_GetVersion(SDL_version* ver)
{
    SDL_VERSION(ver);
}

使用示例:

SDL_version compiled;
SDL_version linked;

SDL_VERSION(&compiled);
SDL_GetVersion(&linked);

printf("We compiled against SDL version %d.%d.%d ...\n",
   compiled.major, compiled.minor, compiled.patch);
printf("We are linking against SDL version %d.%d.%d.\n",
       linked.major, linked.minor, linked.patch);

附注;在您的服务器上运行别人的代码有点危险。

关于将库版本编译成.so文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27927092/

相关文章:

c - fgets() 函数无法识别数据

c++ - Visual Studio 6 VC++ 项目版本 - 如何增加它?

versioning - 确定版本号

c - 仅在 "if loop"内的 "while loop"中打印一次

c++ - if/else 在什么阶段变得比 switch case 更好?可以?

c - fork 没有在母亲身上显示 child 的 pid

Eclipse CDT显示语义错误,但编译正常

c++ - 我可以使用本地声明的枚举类作为模板非类型参数吗? (gcc 给出模糊的错误)

c++ - 如何找出对 C++ 符号的引用

git - 如何区分多分支构建中的快照?