В моем модуле ядра есть два очень коротких исходных файла C (основной файл и файлы daq.c и daq.h). Заголовочный файл содержит ряд переменных и функций. Когда я обычно компилирую функции, объявляя переменную в файле daq.h:
volatile uint32_t *gpio;
Я получаю следующую ошибку:
error In function `.LANCHOR1':
daq.c:(.bss+0x50): multiple definition of `gpio'
Эта ошибка решается только путем объявления переменной статической, как показано ниже:
static volatile uint32_t *gpio;
Модуль ядра работает нормально, но в этом случае я получаю следующее предупреждение, поскольку статическое объявление создает отдельную копию для каждого файла, в который он включен:
warning: ‘gpio’ defined but not used [-Wunused-variable]: static volatile uint32_t *gpio;
Я пытался объявить его внешним или просто объявить переменную как uint32_t *gpio
вместо того, чтобы объявлять ее статической, но затем я получаю:
WARNING: "gpio" undefined!
за которым следует сообщение «определение вне дерева» в журнале dmesg, когда модуль вставлен (и модуль не загружен).
Итак, как в этом случае лучше всего поступить, чтобы объявить переменную? Правильно ли объявить это как:
static volatile uint32_t *gpio;
и просто опустить предупреждение «определено, но не используется», выданное компилятором? Я не думаю, что просто «исключать» предупреждения — это хорошая практика, особенно когда речь идет о модулях ядра.
Заранее спасибо.
extern
. Множественное определение... ошибки компоновщика Затем вы можете определить переменная в файле.c
(безstatic
). - person Tsyvarev   schedule 23.11.2019extern
. В.c
файле их быть не должно. - person S.S. Anne   schedule 23.11.2019