Forum: Compiler & IDEs CMake Konfiguration für lvgl


von Johannes S. (Gast)


Angehängte Dateien:

Lesenswert?

Ich möchte ein Mbed Projekt mit lvgl und dem neuen CLI2 von Mbed 
kompilieren, welches jetzt das cmake build system benutzt.
Als Basis habe ich ein Blinky genommen und https://github.com/lvgl/lvgl 
in das Projekt geklont. lvgl hat auch eine CMakeLists.txt, sollte 
eigentlich funktionieren.
Die Quellen in lvgl\src kompilieren ohne Fehler, aber es werden auch die 
examples übersetzt und da gibt es Fehler weil lvgl.h nicht gefunden 
wird. Dafür sollte es zwei Lösungen geben: examples optional übersetzen 
oder lvgl als Includepfad setzen. Die cmake Konfiguration durchblicke 
ich aber noch nicht und ich weiss nicht wie das Problem am Besten gelöst 
wird. Include Pfad setzen mit target_include_directories(${APP_TARGET} 
PRIVATE lvgl) hat nicht geholfen.
Als Workaround habe ich dann aus dem lvgl/CMakeLists.txt die Zeile 
add_library(lvgl_examples STATIC ${EXAMPLE_SOURCES}) auskommentiert. 
Damit kompiliert alles, aber beim Linken fehlen jetzt noch die lvgl 
Objektfiles, welchen Zauberspruch muss ich dafür in die cmake Konfig 
reinschreiben?
Habt ihr einen Tipp für ein gutes cmake Tutorial?

Edit:
ok, linken klappt jetzt auch mit:
1
target_link_libraries(${APP_TARGET}
2
    PRIVATE
3
        lvgl
4
)

oder geht es noch anders? Diese cmake Konfiguration wird ja aufwändiger 
als das eigentliche Programm...

von Johannes S. (Gast)


Lesenswert?

ich bin etwas weitergekommen, das vorherige Problem waren falsche 
includes in einigen Beispielen. Unschärfe durch die Historie, PR wurde 
schnell gemerged.

Bin leider immer noch zu dumm für cmake: habe die CMakeLists in lvgl auf 
effektiv dieses geändert:
1
    file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/*.c)
2
    add_library(lvgl INTERFACE ${SOURCES})

im Hauptprojekt wird lvgl eingebunden mit:
1
target_link_libraries(${APP_TARGET} 
2
    mbed-os
3
    lvgl
4
    lvglDriver
5
)

da lvgl als 'INTERFACE' lib gebaut wird, werden jetzt keine .c files 
kompiliert und der Linker meckert.
Wenn ich lvgl als 'STATIC' lib baue, ist der Linker zufrieden, aber das 
binary platzt aus allen Nähten.

add_library(lvgl INTERFACE) scheint richtig zu sein, aber warum werden 
die Quellen in dem Fall nicht kompiliert?

von Rolf M. (rmagnus)


Lesenswert?

Johannes S. schrieb:
> enn ich lvgl als 'STATIC' lib baue, ist der Linker zufrieden, aber das
> binary platzt aus allen Nähten.

Tja, dann ist die lib eben zu groß.

> add_library(lvgl INTERFACE) scheint richtig zu sein, aber warum werden
> die Quellen in dem Fall nicht kompiliert?

Weil das genau dafür da ist. Aus der Doku:

"add_library(<name> INTERFACE)

Creates an Interface Library. An INTERFACE library target does not 
compile sources and does not produce a library artifact on disk. 
However, it may have properties set on it and it may be installed and 
exported."

von Johannes S. (Gast)


Lesenswert?

Rolf M. schrieb:
> Tja, dann ist die lib eben zu groß.

das war es wohl wirklich, für ein anderes target compiliert und es 
passt. Mit meiner falschen Konfig war der Overflow aber bei >160 kB, 
also ganz unplausibel.
lvgl braucht jetzt 88506 Bytes, ich hatte schon einiges deaktiviert und 
gehofft es würde kleiner. Es ist zwar ein develop build mit wenig 
Optimierung, release spart nochmal wenige kb, aber die Werbung sagt '64 
kB flash and 8 kB RAM is enough for a simple user inteface.', da müsste 
also nochwas abgespeckt werden.

ein Problem war noch die sources im add_library anzugeben, im Kommentar 
für MICROPY:
1
        # ${SOURCES} must NOT be given to add_library directly for some reason (won't be built)
2
        target_sources(lvgl_interface INTERFACE ${SOURCES})
damit werden die Quellen mit dem Hauptprogramm kompiliert.

https://github.com/lvgl/lvgl/blob/40364453b0eb313f035aa992fd02b0c50e925d35/CMakeLists.txt#L86-L90
das ist doch unschön an cmake, wenn jedes environment seine eigene cmake 
Konfiguration braucht. Scheint aber dann nötig zu sein?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.