7 duplicate symbols for architecture x86_64 - Xcode - Си

Как я понял проблема в 7 перменных которые я обьявляю в x.h файле, и инициализирую в файле x.c.

Не понимаю как решить эту проблему.

Возможно ошибка возникает также потому что я написал строку #include "x.h" и в main.c.


Ответы (2 шт):

Автор решения: DiD

Объявляйте свои определения внутри условий

/* Такой заголовочник можно подлючать сколько хотите раз */

#ifndef MYDEF  /* условие: не определено ли MYDEF */
#define MYDEF /* Определяем определение MYDEF */
   /* дальше идут определения ваших переменных */
   int i;
#else
   /* этот блок необязательный */
#endif
→ Ссылка
Автор решения: mik.ov

Если вы пытаетесь объявить для каждого юнита трансляции одинаковые переменные, то вам стоит добавлять ключевое слово static для каждой из этих переменных.

// A.c
static int a = 10; // изменение данной переменной никак не повлияет на переменную в B.h

// B.c
static int a = 15; // изменение данной переменной никак не повлияет на переменную в A.h

...

Если же вам просто нужны глобальные переменные да еще и так что бы их можно было использовать из разных юнитов трансляции, то вам поможет ключевое слово extern.

// A.c
int a = 10; // изменение данной переменной повлияет на переменную в B.h

// B.c
extern int a; // изменение данной переменной повлияет на переменную в A.h

...

Но имейте ввиду, при объявлении переменной с ключевым словом extern, при сборке юнитов трансляции в объектный файл, вы можете не получить ошибок, но вот на этапе компоновки (линковки), если вдруг обнаружится что нет объявлений переменной с именем a, то вы получите ошибку, т.к. не будет найден ни один юнит трансляции в котором есть такая глобальная переменная.

P.S. вы все так же будете получать ошибки компоновки если снова где нибудь в двух и более местах объявите глобальную переменную с таким же именем, без ключевого слова extern.

→ Ссылка