将库版本编译为.so文件

时间:2015-01-13 16:40:56

标签: c gcc versioning shared-libraries

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

1 个答案:

答案 0 :(得分:0)

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

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

#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 .cvoid 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);

使用示例:

{{1}}

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