как объявить внешнюю переменную, которая будет видна после загрузки динамической библиотеки?

#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. «разные экземпляры объекта из разных исходных файлов используют одну и ту же общую переменную» Нет. Каждый процесс, использующий библиотеку, будет иметь свою собственную копию переменной.