Перейти к содержанию
    

Error[e27]: Entry in module redefined in module

Добрый день!

Имеется несколько .h файлов шрифтов, следующей структуры:

#ifndef FONT1_H
#define FONT1_H
const char Font1[] = {
  0x10,0x0D,0x20,0x5F. . .
};
#endif

Имеется один файл fonts.h, следующей структуры:

#ifndef FONTS_H
#define FONTS_H
#include "Font1.h"
#include "Font2.h"
. . .
#endif

Файл fonts.h подключен в main.c и display.c; display.h подключен в main.c. Получаю ошибку IAR:
«Error[e27]: Entry "Font1" in module main redefined in module display».
Как это исправить? Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Либо Font1 в .h определить как static. Тогда у вас будет несколько экземпляров Font1.

Либо Font1 определить в .c, а в .h задекларировать как extern.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, newbart said:

Как это исправить?

Очень просто - прекратить в H файлах размещать объекты/экземпляры структур, данных и прочего. Для этого есть С файлы.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Однако, шрифты очень часто генерируются как массивы именно в .h-файлах ради экономии файлов.

Автору надо просто немного пересмотреть структуру организации программы. Можно сделать например вот так:

 

Снимок экрана 2024-02-18 134936.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

27 minutes ago, EdgeAligned said:

Однако, шрифты очень часто генерируются как массивы именно в .h-файлах ради экономии файлов.

это от не очень большого ума авторов таких программ )))

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну почему же? Я показал, как можно без конфликтов использовать такие файлы. 

Ну а например в С++ даже и исходный код в h  нормально. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, EdgeAligned said:

Можно сделать например вот так:

и теперь осталось добавить #include "fonts.h" в еще один c/с++ файл и посмотреть как на это отреагирует линкер 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 минуты назад, Forger сказал:

и теперь осталось добавить #include "fonts.h" в еще один c/с++ файл и посмотреть как на это отреагирует линкер 

Если навтыкать этих инклудов по C++ файлам то проблемы, как раз, не будет🙂

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 minutes ago, Arlleex said:

Если навтыкать этих инклудов по C++ файлам то проблемы, как раз, не будет

если просто "навтыкать" да, скорее всего ничего страшного не будет ))

но подразумевается что к объектам в этих h-файлах будут обращаться из разных с-файлов, иначе какой смысл разводить такой "огород"? )))

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, Forger сказал:

если просто "навтыкать" да, ничего страшного ))

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

А не надо в таком случае пытаться обращаться к разным экземплярам - зачем? Ведь в этом и смысл слова const у ТС - это ж просто шрифты.

Для C++ const-объекты имеют внутреннюю линковку, поэтому именно константы определять в хедерах - не зазорно.

Но ладно, у ТС Си - тогда зазорно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 minutes ago, Arlleex said:

А не надо в таком случае пытаться обращаться к разным экземплярам - зачем?

а как быть если один и тот же шрифт используется в разных местах программы, и гуи позволяет работать с графикой даже из разных потоков/задач? ) линкер такой фокус не поймет (хотя gcc может и правда проглотит, честно не пробовал)

у меня такой "фокус" не прокатывает, поэтому шрифты в c-файлах, а их описания в соотв. h-файлах, да и прога сама сразу делает два файла из шрифта (это на примере emWin)

18 minutes ago, Arlleex said:

у ТС Си - тогда зазорно.

ага ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 hours ago, newbart said:

Как это исправить?

Посмотреть текст между препроцессором и компилятором.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

а как быть если один и тот же шрифт используется в разных местах программы, и гуи позволяет работать с графикой даже из разных потоков/задач?

Чуть конкретнее опишите проблемную ситуацию. Пока что не понятно, что линкеру может не понравиться при запихивании константы в хедер. Ну, будет у каждого cpp-модуля "своя" копия этой константы. Да и надо бы глянуть, не оптимизирует ли линковщик такие копии в одну в процессе, например, LTO (думаю, что оптимизирует).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, Arlleex said:

Чуть конкретнее опишите проблемную ситуацию.

у меня нет такой проблемы, emwin сразу делает два файла по c и h

но проблема с подобным хранением объектов - в h файлах (у меня правда они все с расширением hpp, чтобы не путаться). Как только какой-то объект попадает в hpp файл, начинаются "волшебства" с линкером.

Чтобы их избежать в корне , вообще не размещаю никакие объекты в hpp. Исключение - constexpr, это по сути тот же #define.

Но кажется мы снова уходим из темы С в плюсы ))

13 minutes ago, Arlleex said:

Да и надо бы глянуть, не оптимизирует ли линковщик такие копии в одну в процессе, например, LTO (думаю, что оптимизирует).

По идее должен, но это неуверенность как раз и настораживает ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...