Jump to content
    

Си, multiple definition

Не знаю в какую ветку правильно будет пойти с таким вопросом. Вроде тут наиболее подходящая тематика.

 

Собственно имеем на входе - Vitis 2019.2 и структуру проекта:

../src/lib/lib.h
../src/lib/lib.c
../src/main.h
../src/main.c

где, условно:

1) main.c:

/***************************** Include Files ********************************/
#include "main.h"


2) main.h:

/***************************** Include Files ********************************/
#include "lib/lib.h"

/************************** Constant Definitions *****************************/
#define XPAR_ETHBUF_BASEADDR 8192U

/************************** Function Prototypes *****************************/
u32 InitBD(XEmacPs *GemInstPtr);


3) lib.c:

/***************************** Include Files ********************************/
#include "lib.h"

4) lib.h:
#ifndef EMAC_UTIL_H_    
   #define EMAC_UTIL_H_       
   
   /***************************** Include Files ********************************/

   /************************** Constant Definitions *****************************/
   #define BUF_RX_OFFSET
   extern u32 XPAR_ETHBUF_BASEADDR;

   /******************************* Work  Area *********************************/
   u32 InitBD(XEmacPs *GemInstPtr){
    ...
    XEmacPs_BdSetAddressRx(..., XPAR_ETHBUF_BASEADDR + BUF_RX_OFFSET);
    ...
   }
#endif

_________________________________

При компиляции имеем ошибку "multiple definition" по сущности BUF_RX_OFFSET (и некоторым другим, объявленным в "lib.h"). first defined here - в файле "lib.h". Объявление BUF_RX_OFFSET содержится в 2 файлах - main.o и lib.o. 

Так же есть ошибка undefined reference to `XPAR_ETHBUF_BASEADDR'

 

Собственно вопрос - как это лечить?? и желательно без дополнительных настроек компилятора/скриптами, а на уровне кода и структуры проекта. интуитивно понимаю что вопрос в порядке обработки файлов компилятором - что сначала компилится библиотека, а потом МЭЙН. но как это исправить - гугл не помог...

 

Пробовал в МЭЙНе засунуть вклюение библиотеки под #ifndef EMAC_UTIL_H_, но с оснвоной проблемой "multiple definition" это не помогло

 

 

 

      

 

Share this post


Link to post
Share on other sites

5 minutes ago, GAYVER said:

Так же есть ошибка undefined reference to `XPAR_ETHBUF_BASEADDR'

потому что она не #define а переменная

5 minutes ago, GAYVER said:

При компиляции имеем ошибку "multiple definition"

в .h файлах необходимо сделать защиту от двойного включения

5 minutes ago, GAYVER said:
/************************** Constant Definitions *****************************/
   #define BUF_RX_OFFSET

вот это зачем, еще и без значения?

Share this post


Link to post
Share on other sites

17 минут назад, 1113 сказал:

в .h файлах необходимо сделать защиту от двойного включения

она есть

 

17 минут назад, 1113 сказал:

вот это зачем, еще и без значения?

набирал вруную, не дописал. значение есть

Share this post


Link to post
Share on other sites

29 минут назад, GAYVER сказал:

При компиляции имеем ошибку "multiple definition" по сущности BUF_RX_OFFSET (и некоторым другим, объявленным в "lib.h"). first defined here - в файле "lib.h". Объявление BUF_RX_OFFSET содержится в 2 файлах - main.o и lib.o. 

Не пишите чушь: объявление макроса (#define объявляет макрос препроцессора) не может содержаться в объектных файлах. Там уже нет никаких макросов. Макросы препроцессора определяются либо в .h* либо в .c* файлах, и существуют только до момента начала компиляции.

29 минут назад, GAYVER сказал:

Собственно вопрос - как это лечить?? и желательно без дополнительных настроек компилятора/скриптами, а на уровне кода и структуры проекта. интуитивно понимаю что вопрос в порядке обработки файлов компилятором - что сначала компилится библиотека, а потом МЭЙН.

Порядок компиляции тут вообще не при чём. Компилиться файлы могут в каком угодно порядке.

Иногда только имеет значение порядок включения заголовочных файлов. Но в любом случае: Не должно быть двойных определений одного и того же макроса разными значениями (за исключением случая с #undef между ними).

29 минут назад, GAYVER сказал:

но как это исправить - гугл не помог...

Может помочь только учебник по си. Раздел "Препроцессор. Макроподстановка." А лечить также как всегда: исключить двойное определение макроса с одним и тем же именеем, но с разными значениями.

Делаем поиск по всему файлам исходников и ищем все определения BUF_RX_OFFSET.

27 минут назад, 1113 сказал:

в .h файлах необходимо сделать защиту от двойного включения

Обычно ошибка "duplicate definition" возникает не при просто множественном определении одного и того же макроса, а при его множественном определении с разными значениями. Даже если ТС сделает защиту от двойного включения хидеров, то наличие определений одного и того же макроса разными значениями при одних и тех же ключах компиляции - никуда не денется. Как правило си-препроцессор вполне допускает множественные определения одного макроса идентичными значениями. И только это, само по себе, не требует защиты от множественного включения. Хотя возможно есть какие-то компиляторы, в коих не так.

Т.е. - множественное включение

#define BUF_RX_OFFSET

само по себе не является ошибкой. А определения его иным значением в коде ТС не наблюдается. Или он его скрыл.

 

PS: С XPAR_ETHBUF_BASEADDR вообще написана чушь в коде. И тут только автору - читать учебник. Про препроцессор и макросы.

Share this post


Link to post
Share on other sites

4 минуты назад, jcxz сказал:

Не пишите чушь: объявление макроса (#define объявляет макрос препроцессора) не может содержаться в объектных файлах. Там уже нет никаких макросов. Макросы препроцессора определяются либо в .h* либо в .c* файлах, и сущестувуют только до момента компиляции.

вы правы, BUF_RX_OFFSET был не макросом, а константой... почему то забыл про это. и не понимаю почему 2 года назад так сделал... теперь хотя бы понятно кто сам себе буратина и куда копать. спасибо

 

8 минут назад, jcxz сказал:

исключить двойное определение макроса

оно не двойное, оно одинарное. но, как было сказано выше, это не макрос )

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...