LINUX.ORG.RU

SDCC - «multiple definition of ...» при попытке сборки проекта из нескольких файлов (ifndef не забыл)

 


0

1

Я снова с своим быдлокодингом для STM8S. Собственно, следующая структура : - main.c с «главной» частью программы. - gpio.h с gpio_init(), gpio_read(uint8_t pin) и некоторыми переменными (которые можно и вынести, но хотелось бы понять, что я делаю не так). - gpio.c с реализацией функций из gpio.h

Т.е. примерно так main.c

#include "gpio.h"

int main() {
  gpio_init(); 
  ...
}

gpio.h

#ifndef GPIO_H
#define GPIO_H

...
GpioConfigType config;

void gpio_init();
...

#endif

gpio.c

#include "gpio.h"
...

Команды сборки мейком выполняются следующие:

# sdcc -c -mstm8 -I lib/stm8/inc -D STM8S003 -o build/ gpio.c
# sdcc -c -mstm8 -I lib/stm8/inc -D STM8S003 -o build/ main.c
# sdcc -mstm8 -I lib/stm8/inc -D STM8S003 -o build/ build/gpio.rel build/main.rel
Multiple definition of _config

Что может быть не так? config в main.c не применяется - т.е. можно и в gpio.c вынести, но не хотелось бы.

Переменная config определяется дважды - в gpio.c и main.c, ifdef здесь не поможет, он помогает только от неумышленного (через другие .h файлы) повторного включения gpio.h в одном модуле.

anonymous
()

Вынести переменную config в gpio.c нормальное решение, там ей самое место. Только забыть о ней можно случайно - определить позже в другом модуле глобальную переменную с тем же именем и думать потом - почему опять множественное определение? Чтоб такое предотвратить можно сделать gpio_local.h - если все глобальные переменные будут объявляться в файлах [module_name]_local.h то легче будет следить, чтоб они не повторялись. Либо же оставить ее в gpio.h но окружить дополнительными ifdef GPIO_LOCAL ... endif. Если все глобальные переменные будут так окружены, то за ними тоже легко будет уследить.

anonymous
()
Ответ на: комментарий от akk

О точно! В си же extern есть слово.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.