Andrey
Ihor
есть идеи? вроде же все правильно выглядит
Ihor
что-то не так с namespace
undefined reference to `Config::getClientId()'
в таком коде, если вынести
Config_t config;
void setup() {
Logger::init(115200);
String id = Config::getClientId();
config.id = id;
// Config::init(&config);
}
Ihor
хотя в этом примере Logger тоже namespace и он работает, но отличие в том что сам код функции в Logger находится в .h файле, а в Config есть отдельный config.cpp
но вроде как можно же обявить namespace и его функции в .h файле а сами тела функций в .cpp файле или нет?
Ihor
если я в .h файле буду все писать тела функций будут инлайнится, правильно?
Andrey
Andrey
В header файлах обычно пишутся прототипы функций
Ihor
да, я так и сделал
romanetz
Ihor
у меня еще есть rtos оболочка, и там есть namespace task в которого есть .h и .cpp файл и все работает
#include <Arduino.h>
#include <config/config.h>
#include <logger.h>
#include <rtos.h>
Config_t config;
void myTask(void *arg) {
while (true) {
Task::delay(2000);
}
}
void setup() {
Logger::init(115200);
// String id = Config::getClientId();
// config.id = id;
// Config::init(&config);
Task::create(myTask, "task");
}
void loop() {
}
romanetz
Когда в заголовочниках вообще всё
Ihor
Может дело в том что компилятор не может связать config.h и config.cpp файл между собой?
romanetz
.hpp предлагаешь?
Ihor
Ivansuper
Попробовать стоит
Andrey
config.hpp
Ivansuper
Ihor
pltformio, esp32, arduino framework
romanetz
В Qt под Винду используется mingw
Andrey
Хотя пофиг, вообще без расширения инклудится в плюсах
Ihor
нет, та же ошибка, не собралось
romanetz
Andrey
Вообще если неймспейс должно быть ns::class::func
Ihor
Ivansuper
да
А там имплементации прописаны с пространством имен?
romanetz
Ivansuper
Ivansuper
Про .схх файл
Ihor
Про .схх файл
#include <config/config.h>
void Config::init(Config_t *config) {
config->id = getClientId();
}
String Config::getClientId() {
String id;
uint8_t mac[6];
WiFi.macAddress(mac);
for (uint8_t i = 0; i < 6; ++i) {
id += String(mac[i], HEX);
}
return id;
}
Ivansuper
Так. У тебя конфиг в подпапке. Сорцы из подпапки компилятором видятся?
Ihor
у меня config в platformio include папке, logger и rtos, КСТАТИ, у меня в lib папке и там все хорошо, а в include что-то странное с .cpp файлами
Ihor
сами .h из include прекрасно видятся, а вот связка .h -> .cpp видимо нет
Ivansuper
У тебя возможно подпапковые схх файлы не попадают на компиляцию и в итоге линковщик не находит имплементации этих функций
Andrey
Я понял :) у вас похоже линкер матерится :)))
Andrey
Реализации этой функции нету
Ihor
когда-то читал что в Platformio конфиге есть варианты линковки либ, сейчас попробую разные варианты
Ihor
нет, ничего не помогло:
https://docs.platformio.org/en/latest/librarymanager/ldf.html#dependency-finder-mode
Ihor
а у вас был опыт platformio и cpp файлов в папке include ?
Ivansuper
Andrey
Ну я лет 10 на Си пишу...
Ivansuper
Если ты не используешь платформио библиотеки, то рекомендую сложить все файлы с/срр в главную директорию
Ihor
да, все работает, всем спасибо!)
бредово немного и не удобно, h файлы в одном месте cpp в другом..
Ivansuper
Ihor
😂
Ihor
а в platformio или самом arduino ide или самом cpp в контексте микроконтролеров есть нормальные модули?? что это за прикол с глобальной кашой по всему проекту? создал переменную - вот тебе сразу глобальный скоп
Ivansuper
Ivansuper
Это надо читать про виды хранения (к сожалению забыл как называется правильно)
Ihor
static
аааа.. то есть ставлю статик и он будет локально в файле?
Ihor
а нет что-то типа export?)
Ihor
export class .. и т.д
Ivansuper
Не понял
Ivansuper
Есть extern, который явно указывает, что имплементация валяется где угодно, только не в этом же файле
Ihor
ну написал я export class A {} Значит его можно имортировать где нужно
Ivansuper
Понял. Смотри
Ivansuper
Ты делаешь хедер, там описываешь прототип класса. Потом ты этот хедер "импортируешь" везде где он нужен
Ivansuper
Но один из импортеров должен предоставить его реализацию. Иначе линковщик увидит только каркас
Ivansuper
Ты видимо хотел что-то типа Java import
Ihor
ну например у меня есть один .h файл и в нем 2 класса если я заимпортирую этот файл то мне попадает сразу 2 класса а я хотел один
Ihor
Ivansuper
Ihor
😂
Ivansuper
Ihor
как-то же js на cpp написали)
Ihor
ну я уже понял.. спасибо, буду читать!)
Ihor
а еще такой, последний вопрос есть у меня wifi на esp32, все вы знаете
хочу сделать оболчку для него с нужными мне методами, чтобы не дергать по всему проекту родной WiFi.h
класс мне не нужен в принципе потому что я же не могу создать 2-3 инстанса wifi, точней в принципе то могу, но работать оно не будет
я хочу сделать namespace, но внутри namespace мне нужно будет создать приватные переменные которые мне нужны для реализации всего что нужно, но на ружу я не хочу их пускать, в таком случае использовать static в этих переменных/методах или лучше все таки сделать класс хоть и он будет в одном инстансе на проекте?
Ihor
тоже самое касается оболочки на sd карту и всего такого что физически есть только в одном экземпляре
Ivansuper
Ivansuper
Т.о. они не вылезут по видимости
Ihor
а правильно если я сделаю это в namespace или по канонам cpp лучше в классе?
Ivansuper
Эм, тебе не обязательно притягивать им неймспейс
Ivansuper
Если ты сделаешь их в классе, тогда у тебя на каждый инстанс будет свои приватные переменные
Ivansuper
Все что вне классов/структур будет только одно на все инстансы