Несколько объявлений [имя переменной] - PullRequest
0 голосов
/ 29 мая 2019

Я работаю над заголовочным файлом, который выполняет для меня несколько функций.Я включаю заголовочный файл в два отдельных файла, файл c и основной файл.

Я использую #ifndef и #def, но похоже, что он все еще компилируется дважды, потому что в процессе компоновки я получаюserveral

несколько объявлений об ошибках ...

.

файл заголовка PLL

#ifndef PLL_HEADER
#define PLL_HEADER

/********************************************************************
 * includes
 ********************************************************************/
#include "board.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "PITDriver.h"

// Some more stuff

#endif

Вот соответствующий журналданные

[compiling stuff]

Building target: PLL Function.axf
Invoking: MCU Linker

[other linker stuff]

./source/main.o:C:\Users\mailn\Desktop\Work\Sparton\MCUXPresso Workstation\PLL Function\Debug/../source/PLL.h:45: multiple definition of `accumulateVal'
./source/PLL.o:C:\Users\mailn\Desktop\Work\Sparton\MCUXPresso Workstation\PLL Function\Debug/../source/PLL.h:45: first defined here

./source/main.o:C:\Users\mailn\Desktop\Work\Sparton\MCUXPresso Workstation\PLL Function\Debug/../source/PLL.h:46: multiple definition of `getValOne'
./source/PLL.o:C:\Users\mailn\Desktop\Work\Sparton\MCUXPresso Workstation\PLL Function\Debug/../source/PLL.h:46: first defined here

./source/main.o:C:\Users\mailn\Desktop\Work\Sparton\MCUXPresso Workstation\PLL Function\Debug/../source/PLL.h:47: multiple definition of `getValTwo'
./source/PLL.o:C:\Users\mailn\Desktop\Work\Sparton\MCUXPresso Workstation\PLL Function\Debug/../source/PLL.h:47: first defined here

./source/main.o:C:\Users\mailn\Desktop\Work\Sparton\MCUXPresso Workstation\PLL Function\Debug/../source/PLL.h:48: multiple definition of `countTo'
./source/PLL.o:C:\Users\mailn\Desktop\Work\Sparton\MCUXPresso Workstation\PLL Function\Debug/../source/PLL.h:48: first defined here

./source/main.o:C:\Users\mailn\Desktop\Work\Sparton\MCUXPresso Workstation\PLL Function\Debug/../source/PLL.h:49: multiple definition of `runUntil'
./source/PLL.o:C:\Users\mailn\Desktop\Work\Sparton\MCUXPresso Workstation\PLL Function\Debug/../source/PLL.h:49: first defined here

./source/main.o:C:\Users\mailn\Desktop\Work\Sparton\MCUXPresso Workstation\PLL Function\Debug/../source/PLL.h:50: multiple definition of `currentValue'
./source/PLL.o:C:\Users\mailn\Desktop\Work\Sparton\MCUXPresso Workstation\PLL Function\Debug/../source/PLL.h:50: first defined here

collect2.exe: error: ld returned 1 exit status
make: *** [makefile:39: PLL Function.axf] Error 1

1 Ответ

0 голосов
/ 29 мая 2019

Исправление сделано согласно комментарию @ Peter

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

У вас, кажется, есть две единицы компиляции:

  • одна, которая компилирует ваши PLL.h и PLL.c для создания PLL.o

  • тот, который компилирует ваши main.c и PLL.h для создания main.o

Оба ваших объектных файла содержат переменные, которые вы определили в PLL.h и, следовательно,когда вы нажимаете на компоновщик, он выдает ошибку, потому что переменные были объявлены дважды (один раз в каждом объектном файле).

Чтобы исправить эту ошибку, вы можете либо изменить способ компиляции, чтобы объединить два модуля компиляции.Или (если вы используете IDE, которая автоматически обрабатывает вашу компиляцию), вы можете применить следующие изменения, чтобы избежать определения переменной в вашем заголовке.

В заголовке: (измените определение на объявление)

extern int x;

В исходном файле: (определить переменную)

int x;
...