Ссылка на правильную библиотеку

Я не думаю, что на мой вопрос здесь уже ответили здесь. Итак, вот оно, у меня есть статическая библиотека, которую я периодически поддерживаю и обновляю. Я также правильно обновляю номер версии. Теперь мое приложение, использующее эту библиотеку, должно ссылаться на точно такую ​​же версию библиотеки, а не на более старые или новые. Одна вещь, которую я пробовал, заключалась в том, чтобы использовать предопределенные макросы в заголовочном файле библиотек и проверять их в своем приложении. Это сработало, но таким образом вы можете только обеспечить правильные файлы заголовков. Есть ли какой-нибудь способ, чтобы ссылка не удалась, если это неправильная библиотека?? Я надеюсь, что вопрос немного ясен.

Хари


person Hari    schedule 20.12.2010    source источник
comment
Не забудьте принять ответ, который вы считаете наиболее полезным. Это галочка, которую вы видите под оценкой ответа. Вы должны сделать это для всех своих вопросов, на которые вы получили один или несколько полезных ответов (один вариант ответа на вопрос).   -  person Jonathan Leffler    schedule 21.12.2010


Ответы (2)


Я не уверен, что буду рекомендовать это, но...

Заголовок может включать:

#define LIB_VERSION_SUFFIX _3_17

#define LIB_PASTER(x, y)    x ## y
#define LIB_EVALUATOR(x, y) LIB_PASTER(x, y)
#define LIB_FUNCTION(x)     LIB_EVALUATOR(x, LIB_VERSION_SUFFIX)

#define lib_functionA LIB_FUNCTION(lib_functionA)

extern int lib_functionA(const char *, int);

И т.п.

Пользователь кода пишет в терминах недекорированных имен функций (lib_functionA), а заголовок обеспечивает добавление правильного суффикса версии.

Вам не обязательно изменять каждую функцию; вам нужно убедиться, что некоторые функции, которые будут использоваться всегда, отмечены номером версии. Если есть функция инициализации (возможно, lib_init()), используйте ее. Вы можете сделать это с переменной; сложная часть заключается в обеспечении того, чтобы переменная упоминалась в каждой программе.

Обратите внимание, что чаще всего гарантируется, что интерфейс библиотеки остается неизменным в разных версиях, чтобы программы могли быть связаны с любой версией без необходимости компиляции.

person Jonathan Leffler    schedule 20.12.2010
comment
всем спасибо. Джонатан, метод, который вы упомянули, кажется лучшим. Большое спасибо, Джонатан. - person Hari; 21.12.2010

Все, что вам нужно, это уникальный символ, связанный с номером версии, например:

int version_1_1_5=0;

в библиотеке и некоторое использование его в приложении, например:

extern int version_1_1_5; //decl
int *p = &version_1_1_5;  // use
person Yttrill    schedule 20.12.2010
comment
Трудность здесь заключается в том, чтобы пользователь всегда ссылался на переменную версии. Заголовок может делать что-то вроде: static const int *lib_version = &lib_version_1_1_5;, чтобы каждый объектный файл, содержащий заголовок, ссылался на версию библиотеки, с которой он был скомпилирован. - person Jonathan Leffler; 20.12.2010