GAYVER 2 September 30, 2025 Posted September 30, 2025 · Report post Не знаю в какую ветку правильно будет пойти с таким вопросом. Вроде тут наиболее подходящая тематика. Собственно имеем на входе - 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" это не помогло Quote Share this post Link to post Share on other sites More sharing options...
1113 17 September 30, 2025 Posted September 30, 2025 · Report post 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 вот это зачем, еще и без значения? Quote Share this post Link to post Share on other sites More sharing options...
Forger 28 September 30, 2025 Posted September 30, 2025 · Report post 18 minutes ago, GAYVER said: Не знаю в какую ветку правильно будет пойти с таким вопросом. вот в эту: https://electronix.ru/forum/forum/192-programmirovanie/ Quote Share this post Link to post Share on other sites More sharing options...
GAYVER 2 September 30, 2025 Posted September 30, 2025 · Report post 17 минут назад, 1113 сказал: в .h файлах необходимо сделать защиту от двойного включения она есть 17 минут назад, 1113 сказал: вот это зачем, еще и без значения? набирал вруную, не дописал. значение есть Quote Share this post Link to post Share on other sites More sharing options...
jcxz 350 September 30, 2025 Posted September 30, 2025 · Report post 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 вообще написана чушь в коде. И тут только автору - читать учебник. Про препроцессор и макросы. Quote Share this post Link to post Share on other sites More sharing options...
GAYVER 2 September 30, 2025 Posted September 30, 2025 · Report post 4 минуты назад, jcxz сказал: Не пишите чушь: объявление макроса (#define объявляет макрос препроцессора) не может содержаться в объектных файлах. Там уже нет никаких макросов. Макросы препроцессора определяются либо в .h* либо в .c* файлах, и сущестувуют только до момента компиляции. вы правы, BUF_RX_OFFSET был не макросом, а константой... почему то забыл про это. и не понимаю почему 2 года назад так сделал... теперь хотя бы понятно кто сам себе буратина и куда копать. спасибо 8 минут назад, jcxz сказал: исключить двойное определение макроса оно не двойное, оно одинарное. но, как было сказано выше, это не макрос ) Quote Share this post Link to post Share on other sites More sharing options...