2015-01-23 2 views
3

Я хотел бы поместить строку версии в статически связанную библиотеку и обеспечить, чтобы она включалась в образ любого исполняемого файла, который ее связывает, поэтому я могу проверить изображение (например, strings) и посмотреть строку версии.Можно ли обеспечить включение строки из статической библиотеки в любой исполняемый файл, который связывает его?

Возможно ли это со стандартом C и/или gcc и без необходимости специально настраивать параметры компоновки исполняемого файла? (Потому что регулируя связывание исполняемых файлов, которые используют эти статические библиотеки является то, что легко забыть/утомительно поддерживать ...)

Кажется, мне удалось добиться этого в C++ с

extern char const * that_version_string; 
static char const * const foo_that_version_string = that_version_string; 

в файле заголовков библиотек. Но C не скомпилирует это: «неконтинентальный инициализатор» или что-то в этом роде.

+1

Вы имеете в виду статически связанную библиотеку? Потому что если так, связанный exe будет включать в себя библиотечный код, и, следовательно, ваша строка версии библиотеки уже будет в файле. –

+0

@Peter M: Да, статически связанный. Связанный exe будет содержать только ссылки/используемые объекты из библиотеки, а не все объекты. Я не хочу изменять это поведение для любых объектов, кроме этой строки версии. Например. exe должен по-прежнему содержать только необходимые функции из библиотеки. – Zrin

+0

Почему бы вам просто не добавить в библиотеку 'const char * Version() {return" your_version_str ";}'? Строка (константа) будет находиться в секции данных RO объекта кода библиотеки, и функция будет возвращать указатель на эту строку всякий раз, когда она вызывается. –

ответ

1

Скажем, библиотека foo имеет функцию инициализации fooInit, что должна называться для того, чтобы использовать эту библиотеку. Затем в этой функции введите следующий код.

char const * that_version_string = "Foo 1.0"; 
char const * this_version_string; 

void fooInit(void) 
{ 
    this_version_string = that_version_string; 

    // more initialization code ... 
} 

Обязательно проверьте код сборки при компиляции библиотеки, чтобы убедиться, что компилятор не оптимизировал из задания. Это не должно, поскольку this_version_string является глобальным, который потенциально может быть использован в другом месте.

+0

Это подводит меня к другой идее, которая может работать в некоторых проектах: есть '#define USED_STATIC_LIBRARIES', каждый из которых включает в себя заголовок библиотеки, может расширяться и что основной исполняемый файл может использоваться в функции' print_full_version() ... Это также будет работать для библиотек только для заголовков. Я все еще ищу решение, которое не нуждается в явном сотрудничестве на стороне исполняемого файла - и это будет работать без функции fooInit(). – Zrin

+0

@Zrin Yup, функция 'print_full_version()' в основном исполняемом файле определенно будет работать. Я думаю, что должен был быть какой-то способ вызвать функцию, например. опция '-v', или функция и все, что она ссылается, могут быть оптимизированы. – user3386109

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

  • Нет связанных вопросов^_^