#c #compilation #linker
Вопрос:
Я где-то видел, что определение глобальной переменной в общей библиотеке-плохая идея (потому что могут возникнуть конфликты имен? ) и лучше инкапсулировать его в структуру или класс. Но предположим, что переменная в настоящее время объявлена в общей библиотеке (файл.so), и я должен написать программу на языке Си, которая использует эту переменную, и в соответствии с аргументом команды разные экземпляры объекта из разных исходных файлов используют одну и ту же общую переменную из общей библиотеки. Поэтому во время ссылки я не могу видеть переменную, и она будет доступна только во время выполнения после загрузки динамической библиотеки. И предположим, что у меня недостаточно времени, чтобы пересмотреть код, и я должен обойтись этой глобальной переменной. Первая идея (я не знаю, есть ли у меня вторая идея..), которая приходит мне в голову, — это :
В программе на языке Си (my_prog.c) :
extern int __attribute__((weak)) var_x;
в коде общей библиотеки :
int var_x;
Конечно, во время сборки my_prog ошибки ссылки не будет. Но я не уверен, будет ли var_x "in the shared library"
он использоваться после загрузки динамической библиотеки (хотя во время ссылки weak
переменная по умолчанию была связана). Работает ли этот метод?
Комментарии:
1. «разные экземпляры объекта из разных исходных файлов используют одну и ту же общую переменную» Нет. Каждый процесс, использующий библиотеку, будет иметь свою собственную копию переменной.