newbart 0 18 февраля Опубликовано 18 февраля · Жалоба Добрый день! Имеется несколько .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». Как это исправить? Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 18 февраля Опубликовано 18 февраля · Жалоба Либо Font1 в .h определить как static. Тогда у вас будет несколько экземпляров Font1. Либо Font1 определить в .c, а в .h задекларировать как extern. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 18 февраля Опубликовано 18 февраля · Жалоба 2 hours ago, newbart said: Как это исправить? Очень просто - прекратить в H файлах размещать объекты/экземпляры структур, данных и прочего. Для этого есть С файлы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 53 18 февраля Опубликовано 18 февраля · Жалоба Однако, шрифты очень часто генерируются как массивы именно в .h-файлах ради экономии файлов. Автору надо просто немного пересмотреть структуру организации программы. Можно сделать например вот так: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 18 февраля Опубликовано 18 февраля · Жалоба 27 minutes ago, EdgeAligned said: Однако, шрифты очень часто генерируются как массивы именно в .h-файлах ради экономии файлов. это от не очень большого ума авторов таких программ ))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 53 18 февраля Опубликовано 18 февраля · Жалоба Ну почему же? Я показал, как можно без конфликтов использовать такие файлы. Ну а например в С++ даже и исходный код в h нормально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 18 февраля Опубликовано 18 февраля · Жалоба ... либо собирать в GCC, он такое особым образом "съест". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 18 февраля Опубликовано 18 февраля · Жалоба 1 hour ago, EdgeAligned said: Можно сделать например вот так: и теперь осталось добавить #include "fonts.h" в еще один c/с++ файл и посмотреть как на это отреагирует линкер Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 18 февраля Опубликовано 18 февраля · Жалоба 22 минуты назад, Forger сказал: и теперь осталось добавить #include "fonts.h" в еще один c/с++ файл и посмотреть как на это отреагирует линкер Если навтыкать этих инклудов по C++ файлам то проблемы, как раз, не будет🙂 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 18 февраля Опубликовано 18 февраля · Жалоба 18 minutes ago, Arlleex said: Если навтыкать этих инклудов по C++ файлам то проблемы, как раз, не будет если просто "навтыкать" да, скорее всего ничего страшного не будет )) но подразумевается что к объектам в этих h-файлах будут обращаться из разных с-файлов, иначе какой смысл разводить такой "огород"? ))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 18 февраля Опубликовано 18 февраля · Жалоба 1 минуту назад, Forger сказал: если просто "навтыкать" да, ничего страшного )) но подразумевается к ним будут обращаться из разных файлов, и тут линкер увидит объекты с одинаковыми именами, на что незамедлительно гневно отреагирует, иначе смысл просто их втыкать ))) А не надо в таком случае пытаться обращаться к разным экземплярам - зачем? Ведь в этом и смысл слова const у ТС - это ж просто шрифты. Для C++ const-объекты имеют внутреннюю линковку, поэтому именно константы определять в хедерах - не зазорно. Но ладно, у ТС Си - тогда зазорно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 18 февраля Опубликовано 18 февраля · Жалоба 16 minutes ago, Arlleex said: А не надо в таком случае пытаться обращаться к разным экземплярам - зачем? а как быть если один и тот же шрифт используется в разных местах программы, и гуи позволяет работать с графикой даже из разных потоков/задач? ) линкер такой фокус не поймет (хотя gcc может и правда проглотит, честно не пробовал) у меня такой "фокус" не прокатывает, поэтому шрифты в c-файлах, а их описания в соотв. h-файлах, да и прога сама сразу делает два файла из шрифта (это на примере emWin) 18 minutes ago, Arlleex said: у ТС Си - тогда зазорно. ага )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 18 февраля Опубликовано 18 февраля · Жалоба 5 hours ago, newbart said: Как это исправить? Посмотреть текст между препроцессором и компилятором. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 18 февраля Опубликовано 18 февраля · Жалоба 4 минуты назад, Forger сказал: а как быть если один и тот же шрифт используется в разных местах программы, и гуи позволяет работать с графикой даже из разных потоков/задач? Чуть конкретнее опишите проблемную ситуацию. Пока что не понятно, что линкеру может не понравиться при запихивании константы в хедер. Ну, будет у каждого cpp-модуля "своя" копия этой константы. Да и надо бы глянуть, не оптимизирует ли линковщик такие копии в одну в процессе, например, LTO (думаю, что оптимизирует). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 18 февраля Опубликовано 18 февраля · Жалоба 9 minutes ago, Arlleex said: Чуть конкретнее опишите проблемную ситуацию. у меня нет такой проблемы, emwin сразу делает два файла по c и h но проблема с подобным хранением объектов - в h файлах (у меня правда они все с расширением hpp, чтобы не путаться). Как только какой-то объект попадает в hpp файл, начинаются "волшебства" с линкером. Чтобы их избежать в корне , вообще не размещаю никакие объекты в hpp. Исключение - constexpr, это по сути тот же #define. Но кажется мы снова уходим из темы С в плюсы )) 13 minutes ago, Arlleex said: Да и надо бы глянуть, не оптимизирует ли линковщик такие копии в одну в процессе, например, LTO (думаю, что оптимизирует). По идее должен, но это неуверенность как раз и настораживает )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться