Ошибка связи с множественным определением в объектном файле в C - PullRequest
0 голосов
/ 04 октября 2018

У меня есть файл конфигурации для определения некоторых функций и макросов.

my_config.cfg

#define index_zero  0
#define index_one    1 
#define index_two    2
#define index_three  3
 
unit8 index;

typedef struct
{
   const UINT16   first_value;
   const  UINT16   second_value;
   UINT16   updated_value;
}test;
 
 
test   my_array[3];
 
test   my_array[3] = 
{
    {0, 22, 0},
    {0, 44, 0},
    {0, 33, 0}
};

static void set_zero_value (void)
{
    for(i=0;i<3;i++)
    {
       my_array[i].updated_value = first_value;
    }
}

static void set_temp_value (void)
{
    for(i=0;i<3;i++)
    {
       my_array[i].updated_value = second_value;
    }
}

static UINT16 update_value (uint8 index)
{

     return  (my_array[index].updated_value);

}

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

sample1.c

#include "my_config.cfg"
#include "sample1.h"

boolean isrunning(void)
{
  if(condition1)
   return true ;
  else 
    return false ;
}
set_zero_value();
set_temp_value();

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

sample2.c

#include "my_config.cfg"
#include "sample1.h"
#include "sample2.h"

if(isrunning())
{
   UINT16 first = update_value(index_zero);
   UINT16 second = update_value(index_one);
   UINT16 third = update_value(index_two);
}

После компиляции кода я получаю сообщение об ошибке во время связывания

multiple definition of  `my_array` in object file in sample2.o and sample1.o

и

multiple definition of  `index` in object file in sample2.o and sample1.o

iНе знаю, почему я получаю эту ошибку во время связывания, я должен включить оба заголовочных файла для доступа к этим функциям.Любая помощь ?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Файл, который вы включаете, my_config.cfg, содержит определение для my_array.Это означает, что каждый исходный файл, который включает его, содержит копию my_array.Затем, когда эти файлы связаны, вы получаете сообщение об ошибке, потому что каждый скомпилированный исходный файл содержит копию.

Вам нужно переместить определение массива в отдельный исходный файл и поместить объявление массива в вашем заголовочном файле.

Итак, создайте my_config.c со следующими определениями:

#include "my_config.cfg"

test my_array[3] = 
{
    {0, 22, 0},
    {0, 44, 0},
    {0, 33, 0}
};

void set_zero_value (void)
{
    for(i=0;i<3;i++)
    {
       my_array[i].updated_value = first_value;
    }
}

void set_temp_value (void)
{
    for(i=0;i<3;i++)
    {
       my_array[i].updated_value = second_value;
    }
}

UINT16 update_value (uint8 index)
{

     return  (my_array[index].updated_value);

}

И поместите следующие объявления в my_config.cfg:

#ifndef MY_CONFIG_CFG
#define MY_CONFIG_CFG

#define index_zero  0
#define index_one    1 
#define index_two    2
#define index_three  3

unit8 index;

typedef struct
{
   const UINT16   first_value;
   const  UINT16   second_value;
   UINT16   updated_value;
} test;

extern test  my_array[3];

void set_zero_value (void);
void set_temp_value (void);
UINT16 update_value (uint8 index);

#endif
0 голосов
/ 04 октября 2018

Оберните ваш файл cfg условной директивой препроцессора, такой как #ifndef, #define #endif https://gcc.gnu.org/onlinedocs/gcc-3.0.1/cpp_4.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...