2015-01-13 2 views
0

У меня есть библиотека API linux, которую я распространяю как для конечных пользователей, так и для серверов. Когда пользователь должен использовать эту библиотеку, они компилируют и строят .so-файл, который они отправляют на наши серверы для запуска. Я хотел бы, чтобы компилировать в номере версии библиотеки в свой .so-файл, чтобы мой сервер мог проверить, какую версию они скомпилировали. Таким образом, если сервер несовместим с .so-файлом пользователя, я могу отказаться от загрузки библиотеки. Я не уверен, какие варианты мне даже нужно достичь, и надеялся на любые предложения. Пожалуйста, дайте мне знать, если какая-либо информация будет полезной при решении этой проблемы.Составление версии библиотеки в .so-файл

ответ

0

Обычно для библиотек есть функция getLibraryVersion, которая возвращает некоторое постоянное значение, будь то строка, целое число или что-то еще. Это даст вам версию, с которой вы связаны (например, ваша версия .so). У вас может быть дополнительный макрос, чтобы получить скомпилированную версию (например, версию вашего сервера).

Например, API SDL имеет в версии структура и следующую функцию, определенную в одном из своих заголовков:

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

На боковой ноте; немного опасно запускать чужой код на ваших серверах.

+0

Я согласен, мы используем некоторые linux-тюремные заключения и изучаем контейнеры и другие возможные варианты. Но если библиотека имеет эту функцию, как это будет фильтроваться в код пользователя? Когда мой сервер вызывает getLibraryVersion, он просто проверяет собственную версию на сервере, а не версию, с которой был скомпилирован .so? или я не понимаю –

+0

Я обновил свой ответ на примере. Я не совсем уверен, как вы используете .so, который доставляется на ваш сервер, поэтому вам, возможно, потребуется уточнить, что, если это не сработает для вас :) – Julian

+0

Я смотрю ваш код теперь, большое вам спасибо за помощь до сих пор. –

Смежные вопросы