GG ma gdzieś zaszytą optymalizację , żeby nie linkował nieużywanego kodu, widać to w wygenerowanym pliku GUI_Generic_ESP32.env.txt. w postaci wpisu --gc-sections, próbowałem to odkręcić przekazując --no-gc-sections ale nic to nie dało.
Chciałbym podlinkować jawnie pliki z katalogu biblioteki, wszystkie, które mają nazwe driver_XXXXXXX : https://github.com/rkalwak/GUI-Generic/ ... mbusMeters
Dlaczego? Bawię się z przeniesiem wmbusmeters żywcem na ESP i w sumie to na projekcie bez GG działa https://github.com/rkalwak/WmbusmetersTests a tu nie chce linkować kodu z biblioteki wmbus i plików driver_XXXXXX- jest tu jedna rzecz zrobiona w tej bibliotece- implementacje są linkowane z kilkunastu plików i jest jakoś wywoływana metoda z przekazaną funkcją, która rejestruje wszystkie implementacje tak jak tu https://github.com/rkalwak/GUI-Generic/ ... C22-L31C36
Nie wiem jak to dokładnie działa w C++ , ale domyślam się, że to jakaś magia linkera powodująca, że wywołanie przekazanej funkcji faktycznie utworzy obiekt bo implementacje są podlinkowane. Podpowie ktoś jak zmusić linker do uwzględnienia plików tej biblioteki? w platformio.ini w linii 32-33 są moje próby przekazania flag, ale nie umiem z tym dojść do ładu :/
PS: krychy pytałem
GG - manualne linkowanie bibliotek
-
- Posts: 666
- Joined: Mon Feb 06, 2023 8:56 am
@klew podpowiesz jak w frameworku Arduino podlinkować jawnie bibliotekę? Albo znasz jakiś trick w c++ który by spowodował linkowanie wybranych klas?
-
- Posts: 9679
- Joined: Thu Jun 27, 2019 12:16 pm
- Location: Wrocław
Niestety nie wiem.rafalekkalwak@wp.pl wrote: ↑Tue Mar 05, 2024 6:08 pm @klew podpowiesz jak w frameworku Arduino podlinkować jawnie bibliotekę? Albo znasz jakiś trick w c++ który by spowodował linkowanie wybranych klas?
Ogólnie kompilacja na ESP ma włączone optymalizacje wycinające na etapie linkowania nieużywany kod. Te drivery a wmbusmeters mają statyczną zmienną "bool", która powinna się uruchomić przy starcie i zarejestrować driver. Skoro u Ciebie te pliki się nie linkują, to linker zakłada, że ten kod jest nieużywany.
Z tego co czytam, to można przekazać flagi do linkera, ale nie wiem czy w Arduino IDE to jest możliwe.
Jeśli możesz modyfikować te klasy, to możesz zrobić coś takiego. Każdy driver ma taki początek:
Code: Select all
namespace
{
struct Driver : public virtual MeterCommonImplementation
{
Driver(MeterInfo &mi, DriverInfo &di);
};
static bool ok = registerDriver([](DriverInfo&di)
{ ...
Code: Select all
namespace
{
struct Driver : public virtual MeterCommonImplementation
{
Driver(MeterInfo &mi, DriverInfo &di);
};
} // zamykamy namespace
bool okNazwaDrivera = registerDriver([](DriverInfo&di) // wywalam "static" i do ok dodaję nazwę drivera
{
// na samym końcu pliku trzeba usunąć klamrę zamykającą namespace
Code: Select all
extern bool okNazwaDrivera;
extern bool okNazwaInnegoDrivera;
itd
Kiedy będzie Supla Offline Party / SOP#2025 ?
-
- Posts: 666
- Joined: Mon Feb 06, 2023 8:56 am
@klew
Dziękuję! to załatwiło sprawę, mądrego to dobrze posłuchać
Dziękuję! to załatwiło sprawę, mądrego to dobrze posłuchać