GG - manualne linkowanie bibliotek

rafalekkalwak@wp.pl
Posts: 666
Joined: Mon Feb 06, 2023 8:56 am

Post

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 :D
rafalekkalwak@wp.pl
Posts: 666
Joined: Mon Feb 06, 2023 8:56 am

Post

@klew podpowiesz jak w frameworku Arduino podlinkować jawnie bibliotekę? Albo znasz jakiś trick w c++ który by spowodował linkowanie wybranych klas?
User avatar
klew
Posts: 9679
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

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?
Niestety nie wiem.

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)
    { ...
Zmieniasz na:

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
Następnie w Twoim pliku ino dodajesz:

Code: Select all

extern bool okNazwaDrivera;
extern bool okNazwaInnegoDrivera;
itd
Jeśli nadal się nie podlinkuje, to dodaj jakieś logi: Serial.println(okNazwaDrivera);
Kiedy będzie Supla Offline Party / SOP#2025 ?
rafalekkalwak@wp.pl
Posts: 666
Joined: Mon Feb 06, 2023 8:56 am

Post

@klew

Dziękuję! to załatwiło sprawę, mądrego to dobrze posłuchać ;)

Return to “GUI Generic”