Файлы
- Войдите на сайт для отправки комментариев
Втр, 05/02/2019 - 05:10
Проект состоит из нескольких файлов .ino. Лежат в одной папке.
Как исключить один из файлов из компиляции?
Удалить (переименовать) файл из папки?
Или есть другие варианты...
Не зачем, а почему... :)
Не суть. Чужой проект.
Ну так вышло.
Вопрос остался...
Да, как раз суть! Почему они ino? Почему в cpp не переименовать? В них что, во всех есть loop и setup и все должны работать? В чём фишка вообще?
Вопрос и останется пока будете игнорировать встречные вопросы и отвечать "не суть". Я же вроде понятно сказал, что без понимания этого трудно ответить на Ваш вопрос. Ну, если Вас устроит ответ "не суть", то и ладно, считайте, что я так ответил.
'Вопрос не имеет смысла, потому что по правилам, в ардуино-проекте должен быть только один файл INO
А раз их несколько - значит проект писал какой-то "умник", слабо понимающий в предмете. Это сразу заставляет сомневаться, а стоит ли этот проект того, чтоб его повторять.
Ткните носом, пожалуйста, где почитать за эти правила. Или тут расскажите, если можно.
А "умник" вот: https://github.com/jjrobots/B-ROBOT_EVO2/tree/master/Arduino/BROBOT_EVO2 .
Обьясняю - Ардуино ИДЕ при сборке проекта собирает все файлы .ino и .cpp из данной директории в один большой файл. При этом файл .ino считается "основным", а все прочие добавляются к нему. При помощи стандартных директив #include и заголовочных файлов типа .h можно управлять, в каком порядке будут собираться файлы.
Если же файлов .ino много - система не знает, какой главный. Кроме того, файлы .ino не поддерживают включения #include и поэтому сборка такого проекта будет хаотичной, и например при смене версии ИДЕ проект может вообше перестать собираться. Все это говорит о том, что если в проекте много .ino - его собирал не слишком одаренный программист, даже если идея проекта сложная и интересная.
Из того, что я написал выше - следует ответ и на самый первый вопрос ветки - исключить файл .ino из компиляции можно единственным путем - физически удалив ненужный файл из каталога.
Ну и могу посоветовать - не надо копировать чужие кривые проекты - пишите свои!
Вам сюда - тут по англицки, но гугл в помощь!
'Вопрос не имеет смысла, потому что по правилам, в ардуино-проекте должен быть только один файл INO
Тут дело такое... .cpp нужно вкомпиливать через .h , а .ino сам подключается просто и легко. Никаких конфликтов не возникает, проблем от отсутствия там loop() или setup() - тоже. Главным считается тот, у которого имя совпадает с названием каталога. ...или может IDE setup() ищет... не экспериментировал. Но компилится всё четко ))
-------------------------------
Tabs, Multiple Files, and Compilation
Allows you to manage sketches with more than one file (each of which appears in its own tab). These can be normal Arduino code files (no visible extension), C files (.c extension), C++ files (.cpp), or header files (.h).
-------------------------------
Тут дело такое... .cpp нужно вкомпиливать через .h
Вы, наверное, еще не проснулись.
Ни в одном компиляторе .cpp через .h не "вкомпилируется". Нигде и никогда.
Напишите .cpp, положите в директорию, а всё, что из него нужно - явно опишите в .ino или в другом .cpp - со словом extern. Всё отлично скомпилируется и соберётсябезо всякого .h
Тут дело такое... .cpp нужно вкомпиливать через .h , а .ino сам подключается просто и легко. Никаких конфликтов не возникает, проблем от отсутствия там loop() или setup() - тоже. Главным считается тот, у которого имя совпадает с названием каталога. ...или может IDE setup() ищет... не экспериментировал. Но компилится всё четко ))
главный по имени каталога, второй подчиненный, - это пока их два. А если их пять - как в этом проекте?
Ну и в принципе - делать несколько ИНО в проекте - по определению дурость. И рано или поздно она вылезет, как шило из мешка. В языке есть четки правила работы с исходниками, нафига придумывать какую-то фигню.
Для меня - это показатель уровня программиста. Этот проект явно писал какой-то "веб-дизайнер" или "знаток ассемблера" :)))
Переименуйте *.ino, к примеру, в *.txt. Он "исчезнет" из проекта.
Напишите .cpp, положите в директорию, а всё, что из него нужно - явно опишите в .ino или в другом .cpp - со словом extern. Всё отлично скомпилируется и соберётсябезо всякого .h
Согласен. Если объявления функций из .cpp вытащить в ino - всё закомпилится. Если просто кинуть .ino и .cpp в кучу, а потом вызывать из первого функцию второго - будет выкинута ошибка компиляции. В случае с двумя .ino всё проходит без подпрыгиваний.
Насколько это по стандарту - судить Вам, как специалисту. Я поделился своими наблюдениями. В мануале к IDE запрета на множественное применение .ino нет.
главный по имени каталога, второй подчиненный, - это пока их два. А если их пять - как в этом проекте?
...
В языке есть четки правила работы с исходниками, нафига придумывать какую-то фигню.
Думаю, что все .ino тупо склеиваются и рассматриваются далее, как один большой.
И, давайте учитывать, что С/C++ - это одно, а Wiring и Arduino IDE - несколько другое ))
Тут дело такое... .cpp нужно вкомпиливать через .h , а .ino сам подключается просто и легко. Никаких конфликтов не возникает, проблем от отсутствия там loop() или setup() - тоже. Главным считается тот, у которого имя совпадает с названием каталога. ...или может IDE setup() ищет... не экспериментировал. Но компилится всё четко ))
-------------------------------
Tabs, Multiple Files, and Compilation
Allows you to manage sketches with more than one file (each of which appears in its own tab). These can be normal Arduino code files (no visible extension), C files (.c extension), C++ files (.cpp), or header files (.h).
-------------------------------
У меня именно в INO лежат несколько файлов в одном каталоге.
Подтверждаю главный тот что совпадает с названием каталога в котором размещены файлы. Начал ветку читать испугался, что делаю что то не так хотя все и работает. Какие проблемы могут возникнуть с несколькими INO в одном каталоге, ну кроме той, что нельзя определить какой главный, как выясняется главный INO определяется нормально.
Все это говорит о том, что если в проекте много .ino - его собирал не слишком одаренный программист, даже если идея проекта сложная и интересная.
Вот тут поподробнее, в чем заключается неодаренность? Как правильно одариться?
Если серньезно, то я понимаю, что INO будут правильно компилиться и собираться только в Arduino IDE или других IDE с плагинами для Arduino. Или есть еще подводные камни?
В мануале к IDE запрета на множественное применение .ino нет.
в свежих версиях ИДЕ убрали "костыль", который разрешал использовать функции до обьявления. Если же файлов ИНо много - я не понимаю, как обеспечить включение обьявлений функций до кода - ведь порядок сборки файлов ИНО непредсказуем.
В этом смысле и сборку проекта из кучи файлов .cpp без соответсвующих заголовочных я тоже считаю "говнокодом"... Если хочешь, чтобы файлы подключались без усилий - пиши код в файлах .h, их хотя бы можно с помощью @include собирать в правильном порядке. Ну а наиболее правильно - делать пары файлов .h и .cpp
В этом смысле и сборку проекта из кучи файлов .cpp без соответсвующих заголовочных я тоже считаю "говнокодом"... Если хочешь, чтобы файлы подключались без усилий - пиши код в файлах .h, их хотя бы можно с помощью @include собирать в правильном порядке. Ну а наиболее правильно - делать пары файлов .h и .cpp
А кто спорит с тем, что надо делать правильно? Я написал о том, что запрета нет и всё канает.
Сейчас гляну, как там IDE клеит файлы...
Вот тут поподробнее, в чем заключается неодаренность? Как правильно одариться?
обьясняю. Положим у вас есть проект, в котором один главный ИНО и еще четыре неглавных ИНО - А Б С Д
Пока у вас функции из неглавных файлов используются только в главном - все отлично собирается. Но в более-менее сложных проектах исходники требуют перекрестного включения. Если у вас функции из А должны вызываться в Д, а функции Д - из Б и С и так далее - с помощью ИНО вы эту проблему не решите.
А одарится тут просто - оставьте в проекте ОДИН файл ИНО, а остальные перtименуйте в .h, если в них нет глобальных переменных. Если есть переменные - придется делать пары .cpp .h
Сделал три файла:
a.ino
z.ino
compilation_test.ino
На выходе имеем (убрал всякие там #line):
IDE 1.8.5
P.S. сейчас еще последнюю IDE стащу с .cc
UPD: IDE 1.8.8 выдает такую же картину.
Т.е. костыль по-прежнему на месте :(
Напишите .cpp, положите в директорию, а всё, что из него нужно - явно опишите в .ino или в другом .cpp - со словом extern. Всё отлично скомпилируется и соберётсябезо всякого .h
А можно для чайников поподробнее? Сейчас у меня 3 INO файла. В одном из них обработка нажатия клавиш. Одна функция fBtnCheckPress() которая вызывается из "основного" INO файла.
файл incubator.ino
файл keyboard.ino
Результат компиляции
Если переименовать keyboard.ino в keyboard.cpp то получаю такие вот ошибки
Т.е. костыль по-прежнему на месте :(
Архитектурное наследие!
Но тогда мне непонятны жалобы на проблемы компиляции старых скретчей в новом IDE. Периодически же вылезают люди, которым надо функции вверх тащить...
Но тогда мне непонятны жалобы на проблемы компиляции старых скретчей в новом IDE. Периодически же вылезают люди, которым надо функции вверх тащить...
Это, как раз, понятно. Они как-то убрали этот кривой костыль. Но таковых чайников столько вылезло, что их техю поддержку обрушили. И тогда они вставили костыль обратно. В итоге, хрен теперь опять определишь тип в .ino файле и используешь его в параметрах функций, т.к. предоюъявления они вставляют в начало и объялвние типа оказывается после использования :(
А можно для чайников поподробнее? Сейчас у меня 3 INO файла.
....
Если переименовать keyboard.ino в keyboard.cpp то получаю такие вот ошибки
Переименуйте keyboard.ino в keyboard.h. в главный файл .ino не забудьте добавить #include "keyboard.h" - никаких ошибок не будет. И, главное - это будет правильно с точки зрения языка и будет работать в любой версии ИДЕ
Это, как раз, понятно. Они как-то убрали этот кривой костыль. Но таковых чайников столько вылезло, что их техю поддержку обрушили. И тогда они вставили костыль обратно. В итоге, хрен теперь опять определишь тип в .ino файле и используешь его в параметрах функций, т.к. предоюъявления они вставляют в начало и объялвние типа оказывается после использования :(
Не расстраивайтесь раньше времени. Просто добавится немного путаницы с версиями IDE ))
a.ino
z.ino
compilation_test.ino:
результат:
обьясняю. Положим у вас есть проект, в котором один главный ИНО и еще четыре неглавных ИНО - А Б С Д
Пока у вас функции из неглавных файлов используются только в главном - все отлично собирается. Но в более-менее сложных проектах исходники требуют перекрестного включения. Если у вас функции из А должны вызываться в Д, а функции Д - из Б и С и так далее - с помощью ИНО вы эту проблему не решите.
А одарится тут просто - оставьте в проекте ОДИН файл ИНО, а остальные перtименуйте в .h, если в них нет глобальных переменных. Если есть переменные - придется делать пары .cpp .h
Да так и есть. Разложу на А Б С Д Е
А основной INO файл,
Б обработка нажатия клавиш
С файл в котором определяется состояние управляющих механизмов
Д файл меню
Е вывод информации на дисплей
Из файла А и С вызываются функции файла E все работает. Я понял что работает сейчас пока Arduino собирает в единый файл все правильно. Так же понятно что Arduino может собрать файл и расположить объявления функций не в том порядке который мне нужен и тогда возникнут проблемы. Спасибо, буду это учитывать.
Вот то, что происходит НА САМОМ ДЕЛЕ:
(я - в своем амплуа - рассказывать "из чего, на самом деле, тетька сделана")
Вот отсюда. Честно говоря, гуглится на раз.
The Arduino environment performs a few transformations to your sketch before passing it to the avr-gcc compiler:
#line
directives are added to make warning or error messages reflect the original sketch layout.Для инвалидов умственного труда - объясню:
1.Все файлы с расширением .ino сливаюится в один, певым идет тот, чье имя совпадает с именем папки, далее - по алфавиту. У полученного файла ставится расширение .cpp.
2. добавляем #include <arduino.h>
3. создаем все прототипы функций, причем тут бывают глюки (это не я написал ;) ), поэтому лучше пишите прототипы сами. (еще раз - это - не я, это авторы ИДЕ! ;))) )
ВСЁ!!!
----------------------
Теперь понятно, почему второй .ino файл и .cpp по-разному себя ведут?
Теперь понятно, почему второй .ino файл и .cpp по-разному себя ведут?
Сенсей, так какой все ж таки вывод - несколько файлов ИНО в одном проекте - норма или зло? :)
Теперь понятно, почему второй .ino файл и .cpp по-разному себя ведут?
Сенсей, так какой все ж таки вывод - несколько файлов ИНО в одном проекте - норма или зло? :)
А рубашку нужно навыпуск носить или заправленной?
Вот и твой вопрос сродни, такой же бессмысленный. "Каждый дрочит, как он хочет" - народная мудрость.
какой все ж таки вывод - несколько файлов ИНО в одном проекте - норма или зло? :)
Мне понравилось, как Ворота сделал .ino файл в своём пульсметре. Если не видили, не поленитесь скачать и глянуть. Он там в директории RipplesMeter\RipplesMeter :)
Мне понравилось, как Ворота сделал .ino файл в своём пульсметре. Если не видили, не поленитесь скачать и глянуть. Он там в директории RipplesMeter\RipplesMeter :)
спасибо, глянул. Мне нравится :)
Не подумайте. что претендую на тот же уровень - но я в своих проектах примерно так и пишу :)
Вот и твой вопрос сродни, такой же бессмысленный. "Каждый дрочит, как он хочет" - народная мудрость.
не согласен. Несколько .ino в проекте - суксь :)
Блин. Нафига я подписался на уведомления в теме... 25 писем за два часа... :)
Помечаю тему как "решённую". Ответ - "физически удалив ненужный файл".
PS. Где таки почитать за "правильно с точки зрения языка"?
Не с точки зрения даже самого опытного юзера, а именно Языка.
Блин. Нафига я подписался на уведомления в теме...
это было и вправду неосмотрительно - вы теперь от этих уведомлений не избавитесь, они не выключаются :)
Которого Языка?
Не подумайте. что претендую на тот же уровень - но я в своих проектах примерно так и пишу :)
А я в свой для юзеровских плагинов подкладываю второй ino. Так меньше вопросов возникает у "модификаторов".
Язык, это который C (C++).
А чё, тут в самом деле нет кнопки "отписаться"?
АУ, модераторы? Птичку внизу снимаю...
Если ориентироваться на C*, но требуется остаться в оставаясь в концепции Arduino, то распихивать всё по карма... файлам .h/.c/.cpp и инклюдить в основной .ino.
Отписаться просто - в каждом письме тыкайте на "Отписаться". Действие производится несколько раз - по количеству постов "с галочкой". Такой энджин у форума, что поделаешь.
энджин глюпый, или ...
распихивать всё по карма... файлам .h/.c/.cpp и инклюдить в основной .ino.
Гриш, с файлами .с в ИДЕ какая-то засада, во всяком случае в моей 1.6.12
Подробно не вникал, но при использовании в проекте старых библиотек Ардуино приходилось менять .c на .cpp - иначе не собирался.
Подробно не вникал, но при использовании в проекте старых библиотек Ардуино приходилось менять .c на .cpp - иначе не собирался.
По рассказам у нас wdrakula главный, но я могу предположить, что на каком-то этапе развития IDE .cpp стало компилиться через g++, а .c через что-то еще. Раньше, может, всё одному компилеру скармливалось, поэтому в .c допустимо было включать что-то из наворотов C++. Или правила для компилятора задавались разные... Но я тут, скорее всего, уже не копенгаген, так далеко в кроличью нору не падал (может и вообще чушь написал )). Надо конкретный пример расковырять - тогда станет понятно что почём.
Но, в соответствии с вышеприведенной выдержкой мануала, IDE не возражает против тех и других расширений.
Вот и твой вопрос сродни, такой же бессмысленный. "Каждый дрочит, как он хочет" - народная мудрость.
Благодарю, успокоили!
Мне понравилось, как Ворота сделал .ino файл в своём пульсметре. Если не видили, не поленитесь скачать и глянуть. Он там в директории RipplesMeter\RipplesMeter :)
Красота, особенно ino файл! Мне до такого далеко, но буду стремиться.
По рассказам у нас wdrakula главный, но я могу предположить, что... .cpp стало компилиться через g++, а .c через что-то еще.
Рассказываю: ;))))
Да, так оно и есть, в пакете GCC g++ - компилятор С++, gcc - компилятор С.
Вот кусок из platform.txt, там указаны команды компиляции и сценарий их вызова для разных файлов.
Можно ещё вопросик?
В "инструментах" есть Compiler LTO.
Шо це таке?
Можно ещё вопросик?
В "инструментах" есть Compiler LTO.
Шо це таке?
Ты про шо? 0_0
А тебе мама разрешила в интернете всякую каку собирать? ;)))) (шутка)
Это не "искаропки" IDE. Ты в нее всяку фигню добавлял? Кайся! (снова шутка)
----
LTO - это опция "-flto" среди флагов компилятора, смотри мой пост выше.
Обозначает Линк Тайм Оптимизейшн. Если задал вопрос, то тебе еще рано знать, что это такое. (а вот это уже не шутка! ;))) )
Без него размер будет больше... но ведь размер - не главное! Остальное - спрашивай у старших. ;))))))
Ну и шутки у тебя... (не шутка...)
Понимаю так: если LTO Enabled, то размер прошивки уменьшается (в ущерб быстродействию).
Я неправ?
Ну и шутки у тебя... (не шутка...)
Понимаю так: если LTO Enabled, то размер прошивки уменьшается (в ущерб быстродействию).
Я неправ?
Неправ, не в ущерб. К быстродействию вообще никак не относится.
Слушай! Если тебе серьёзно интересно - почитай в сети про LTO.
Ведь везде говорят - если не знаешь что это и зачем - не влезай. Ты форум со справочной перепутал? Не ты первый. Если ты не знаешь, зачем тебе его выключать - то тебе не нужно его выключать. Всё. Точка. Это ответ на вопрос на доступном тебе уровне. Пока ты не столкнешься с глюками, ЛТО тебе только помогает.
С LTO размер, конечно, поменьше, вот только работает не всегда.
Т.е. линковщик что-то пытается сделать, но у него это не всегда получается.
Ну, хоть старается.