Forum: Compiler & IDEs xtensa-lx106-elf-gcc findet include Dateien nicht


von Max M. (maxmicr)


Lesenswert?

Für meine ESP8266 Projekte möchte ich mich gerne an den 
Beispielprojekten von Espressif orientieren 
(https://github.com/espressif/ESP8266_NONOS_SDK/tree/master/examples).

D.h. meine Projektstruktur sieht so aus:

ProjektOrdner
--ProjektOrdner\user\
--ProjektOrdner\user\user_main.c
--ProjektOrdner\user\user_config.h
--ProjektOrdner\user\Makefile (von hier: 
https://github.com/espressif/ESP8266_NONOS_SDK/blob/master/examples/simple_pair/Makefile)
--ProjektOrdner\Makefile (von hier: 
https://github.com/espressif/ESP8266_NONOS_SDK/blob/master/Makefile)

Der Compiler befindet sich im Ordner: 
/opt/esp/crosstool-NG/builds/xtensa-lx106-elf/bin

Die Header-Dateien, die man für den ESP8266 braucht, befinden sich im 
Ordner: /opt/esp/sdk/include

Ich rufe auf meiner Konsole auf:
1
test@Device: ProjektOrdner$ make COMPILE=gcc
2
make[1]: Entering directory '/mnt/c/Users/Standardbenutzer/Documents/ESP8266/ESP8266/user'
3
DEPEND: xtensa-lx106-elf-gcc -M -Os -g -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -ffunction-sections -fdata-sections -fno-builtin-printf -DICACHE_FLASH -DSPI_FLASH_SIZE_MAP=0 -I include -I ../include -I ../include/eagle -I ../driver_lib/include user_main.c
4
In file included from user_main.c:1:0:
5
/opt/esp/crosstool-NG/builds/xtensa-lx106-elf/lib/gcc/xtensa-lx106-elf/4.8.2/include/osapi.h:30:25: fatal error: user_config.h: No such file or directory
6
 #include "user_config.h"
7
                         ^
8
compilation terminated.
9
make[2]: Entering directory '/mnt/c/Users/Standardbenutzer/Documents/ESP8266/ESP8266/user'
10
make[2]: *** user: No such file or directory.  Stop.
11
make[2]: Leaving directory '/mnt/c/Users/Standardbenutzer/Documents/ESP8266/ESP8266/user'
12
../Makefile:331: recipe for target '.subdirs' failed
13
make[1]: *** [.subdirs] Error 2
14
make[1]: Leaving directory '/mnt/c/Users/Standardbenutzer/Documents/ESP8266/ESP8266/user'
15
Makefile:331: recipe for target '.subdirs' failed
16
make: *** [.subdirs] Error 2

Ich hab nun rausgefunden, dass der Compiler gar nicht im richtigen 
Ordner nach Header-Dateien sucht:
1
test@Device: ProjektOrdner$ `xtensa-lx106-elf-gcc -print-prog-name=cc1` -v
2
ignoring nonexistent directory "/opt/esp/crosstool-NG/builds/xtensa-lx106-elf/xtensa-lx106-elf/sysroot/opt/esp/crosstool-NG/builds/xtensa-lx106-elf/xtensa-lx106-elf/sysroot/include"
3
#include "..." search starts here:
4
#include <...> search starts here:
5
 /opt/esp/crosstool-NG/builds/xtensa-lx106-elf/lib/gcc/xtensa-lx106-elf/4.8.2/include
6
 /opt/esp/crosstool-NG/builds/xtensa-lx106-elf/lib/gcc/xtensa-lx106-elf/4.8.2/include-fixed
7
 /opt/esp/crosstool-NG/builds/xtensa-lx106-elf/lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/include
8
 /opt/esp/crosstool-NG/builds/xtensa-lx106-elf/xtensa-lx106-elf/sysroot/usr/include
9
End of search list.

Meine $PATH-Variable enthält den richtigen include-Ordner:
1
echo $PATH
2
/opt/esp/sdk/include:/opt/esp/sdk/:/opt/esp/crosstool-NG/builds/xtensa-lx106-elf/bin

Ich gehe also fälschlicherweise davon aus, dass der Compiler auch in den 
$PATH-Ordnern nach include-Dateien sucht?

Ich weiß nicht, ob das eine gute Idee war, aber ich hab meinen 
/include/-Ordner in den Ordner kopiert, in dem der Compiler nach 
includes sucht:
1
cp -a /opt/esp/sdk/include /opt/esp/crosstool-NG/builds/xtensa-lx106-elf/lib/gcc/xtensa-lx106-elf/4.8.2/

Zuvor wurde auch "osapi.h" nicht gefunden, die ist im eben kopierten 
Ordner enthalten gewesen, nun wird aber "user_config.h" nicht gefunden 
(siehe erste Codeblock). Bevor ich nun alles hin und her kopiere möchte 
ich gerne wissen, wie ich das komfortabler lösen kann?

Grüße

: Bearbeitet durch User
von John Doe (Gast)


Lesenswert?

Max M. schrieb:
> Ich gehe also fälschlicherweise davon aus, dass der Compiler auch in den
> $PATH-Ordnern nach include-Dateien sucht?

Richtig.

> Ich weiß nicht, ob das eine gute Idee war, aber ich hab meinen
> /include/-Ordner in den Ordner kopiert, in dem der Compiler nach
> includes sucht:

Ich aber: war es nicht.

> Zuvor wurde auch "osapi.h" nicht gefunden, die ist im eben kopierten
> Ordner enthalten gewesen, nun wird aber "user_config.h" nicht gefunden
> (siehe erste Codeblock). Bevor ich nun alles hin und her kopiere möchte
> ich gerne wissen, wie ich das komfortabler lösen kann?

Option -I:
https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html

von Max M. (maxmicr)


Lesenswert?

John Doe schrieb:
> Option -I:

Ich bin nun bei diesem Verlauf:
1
test@Device:/mnt/c/Users/Standardbenutzer/Documents/ESP8266/ESP8266$ make COMPILE=gcc
2
make[1]: Entering directory '/mnt/c/Users/Standardbenutzer/Documents/ESP8266/ESP8266/user'
3
DEPEND: xtensa-lx106-elf-gcc -M -Os -g -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -ffunction-sections -fdata-sections -fno-builtin-printf -DICACHE_FLASH -DSPI_FLASH_SIZE_MAP=0 -I /opt/esp/sdk/include/ -I /user/ user_main.c
4
In file included from user_main.c:1:0:
5
/opt/esp/sdk/include/osapi.h:30:25: fatal error: user_config.h: No such file or directory
6
 #include "user_config.h"
7
                         ^
8
compilation terminated.

"osapi.h" wird nun von meinem include-Ordner geladen, "user_config.h" 
befindet sich allerdings nicht im selben Ordner wie "osapi.h" sondern in 
meinem ProjektOrdner - und wird deswegen wahrscheinlich auch nicht 
gefunden. Obwohl ich der Meinung bin, dass der Parameter:
1
-I /user/

den Compiler auf die richtige Spur führen müsste - tut er aber nicht.

Wie behebt man dieses Problem?

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was machen die Leerzeichen nach dem -I? Das sieht merkwürdig aus.

von Max M. (maxmicr)


Lesenswert?

Rufus Τ. F. schrieb:
> Was machen die Leerzeichen nach dem -I? Das sieht merkwürdig aus.

Ich seh da nur ein einzelnes Leerzeichen, so wurde der Parameter auch 
definiert?
1
-I dir

Oder sehe ich etwas nicht?

: Bearbeitet durch User
von Max M. (maxmicr)


Lesenswert?

Mag mir jemand die Kombination der zwei Makefiles erklären?

Das sind die Positionen der beiden Makefiles:

ProjektOrdner
--ProjektOrdner/Makefile
--ProjektOrdner/user/Makefile

und ich rufe das Makefile in ProjektOrdner/Makefile auf.

Ich hab den Paramter "-I ." hinzugefügt, jetzt scheinen alle 
Headerdateien gefunden zu werden, allerdings existiert für den Compiler 
der Ordner "user" auf einmal nicht mehr?
1
ESP8266$ make COMPILE=gcc
2
make[1]: Entering directory '/mnt/c/Users/Standardbenutzer/Documents/ESP8266/ESP8266/user'
3
DEPEND: xtensa-lx106-elf-gcc -M -Os -g -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -ffunction-sections -fdata-sections -fno-builtin-printf -DICACHE_FLASH -DSPI_FLASH_SIZE_MAP=0 -I /user -I /opt/esp/sdk/include -I . user_main.c
4
make[2]: Entering directory '/mnt/c/Users/Standardbenutzer/Documents/ESP8266/ESP8266/user'
5
make[2]: *** user: No such file or directory.  Stop.
6
make[2]: Leaving directory '/mnt/c/Users/Standardbenutzer/Documents/ESP8266/ESP8266/user'
7
../Makefile:331: recipe for target '.subdirs' failed
8
make[1]: *** [.subdirs] Error 2
9
make[1]: Leaving directory '/mnt/c/Users/Standardbenutzer/Documents/ESP8266/ESP8266/user'
10
Makefile:331: recipe for target '.subdirs' failed
11
make: *** [.subdirs] Error 2


Edit:

Mir ist gerade aufgefallen, dass die Struktur bei Espressif wie folgt 
ist:

ESP8266_NONOS_SDK
--ESP8266_NONOS_SDK/Makefile (<-- liegt bei mir in 
ProjektOrdner/Makefile)
--ESP8266_NONOS_SDK/examples/simple_pair/Makefile (<-- liegt bei mir in 
ProjektOrdner/user/Makefile)

D.h. das zweite Makefile befindet sich nicht eine Ebene tiefer (wie bei 
mir) im Vergleich zum "Haupt" Makefile, sondern zwei Ebenen (der Ordner 
examples enthält kein Makefile).

: Bearbeitet durch User
von Max M. (maxmicr)


Lesenswert?

Ich hab nun die Struktur genauso wie in den Espressif-Beispielen:

Makefile
Projects
--ProjektOrdner
--ProjektOrdner/Makefile
--ProjektOrdner/user
--ProjektOrdner/user/user_main.c
--ProjektOrdner/user/user_config.h

Jetzt bekomm ich gar keine Ausgabe mehr:
1
test@Device:/mnt/c/Users/Standardbenutzer/Documents/$ make COMPILE=gcc

:(

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Max M. schrieb:
> Ich seh da nur ein einzelnes Leerzeichen, so wurde der Parameter auch
> definiert?

Eben genau das Leerzeichen gehört da nicht hin.
(Ich verwendete den Plural, da -I zweimal auftaucht)

Keine einzige der anderen Optionen des gcc hat zwischen dem 
Optionsnamen und dem Argument ein Leerzeichen, das sollte zu Denken 
geben.

von Max M. (maxmicr)


Lesenswert?

Rufus Τ. F. schrieb:
> Keine einzige der anderen Optionen des gcc hat zwischen dem
> Optionsnamen und dem Argument ein Leerzeichen, das sollte zu Denken
> geben.

Ich will gar nicht gegen dich argumentieren, aber in den Makefiles von 
espressif ist es auch mit Leerzeichen. Da das kompilieren inzwischen 
halbwegs funktioniert, wage ich zu behaupten, dass die Leerzeichen nicht 
stören? Falls ich hier falsch liege, bitte berichtigen.

Zwischenzeitlich ist mir aufgefallen, dass ich ein weiteres Makefile 
vergessen habe (das direkt im /user/-Ordner). D.h. ich bin inzwischen 
bei 3 geschachtelten Makefiles.

Ich bin wieder einen Schritt weiter:
1
Projects$ make COMPILE=gcc BOOT=new APP=0 SPI_SPEED=40 SPI_MODE=DIO SPI_SIZE_MAP=2
2
make[1]: Entering directory '/mnt/c/Users/Standardbenutzer/Documents/ESP8266/Projects/ESP8266'
3
make[2]: Entering directory '/mnt/c/Users/Standardbenutzer/Documents/ESP8266/Projects/ESP8266/user'
4
DEPEND: xtensa-lx106-elf-gcc -M -Os -g -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -ffunction-sections -fdata-sections -fno-builtin-printf -DICACHE_FLASH -DSPI_FLASH_SIZE_MAP=2 -I include -I ./ -I ../../include/ets -I ../include -I ../../include -I ../../include/eagle -I ../../driver_lib/include user_main.c
5
xtensa-lx106-elf-gcc -Os -g -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -ffunction-sections -fdata-sections -fno-builtin-printf  -DICACHE_FLASH -DSPI_FLASH_SIZE_MAP=2   -I include -I ./ -I ../../include/ets -I ../include -I ../../include -I ../../include/eagle -I ../../driver_lib/include  -o .output/eagle/debug/obj/user_main.o -c user_main.c
6
xtensa-lx106-elf-ar ru .output/eagle/debug/lib/libuser.a .output/eagle/debug/obj/user_main.o
7
xtensa-lx106-elf-ar: creating .output/eagle/debug/lib/libuser.a
8
make[2]: Leaving directory '/mnt/c/Users/Standardbenutzer/Documents/ESP8266/Projects/ESP8266/user'
9
make[1]: *** No rule to make target '../ld/eagle.app.v6.ld', needed by '.output/eagle/debug/image/eagle.app.v6.out'.  Stop.
10
make[1]: Leaving directory '/mnt/c/Users/Standardbenutzer/Documents/ESP8266/Projects/ESP8266'
11
Makefile:331: recipe for target '.subdirs' failed
12
make: *** [.subdirs] Error 2

Ich hab nach der Zeile:
1
No rule to make target '../ld/eagle.app.v6.ld'

schon gesucht, allerdings keine hilfreichen Ergebnisse gefunden. Weiß da 
jemand was?

Edit:

Ich habs hinbekommen, ich weiß nicht, ob das im Sinne des Erfinders war, 
aber es hat gereicht, einen Ordner bin anzulegen und die drei Ordner 
ld, lib, tools aus dem sdk-Ordner in den ProjektOrdner zu 
kopieren. Anscheinend erwartet das Makefile, dass diese Dateien und 
Ordner vorhanden sind:
1
make[1]: Entering directory '/mnt/c/Users/Standardbenutzer/Documents/ESP8266/Projects/ESP8266'
2
make[2]: Entering directory '/mnt/c/Users/Standardbenutzer/Documents/ESP8266/Projects/ESP8266/user'
3
DEPEND: xtensa-lx106-elf-gcc -M -Os -g -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -ffunction-sections -fdata-sections -fno-builtin-printf -DICACHE_FLASH -DSPI_FLASH_SIZE_MAP=4 -I include -I ./ -I ../../include/ets -I ../include -I ../../include -I ../../include/eagle -I ../../driver_lib/include user_main.c
4
xtensa-lx106-elf-gcc -Os -g -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -ffunction-sections -fdata-sections -fno-builtin-printf  -DICACHE_FLASH -DSPI_FLASH_SIZE_MAP=4   -I include -I ./ -I ../../include/ets -I ../include -I ../../include -I ../../include/eagle -I ../../driver_lib/include  -o .output/eagle/debug/obj/user_main.o -c user_main.c
5
xtensa-lx106-elf-ar ru .output/eagle/debug/lib/libuser.a .output/eagle/debug/obj/user_main.o
6
make[2]: Leaving directory '/mnt/c/Users/Standardbenutzer/Documents/ESP8266/Projects/ESP8266/user'
7
xtensa-lx106-elf-gcc  -L../lib -nostdlib -T../ld/eagle.app.v6.ld -Wl,--no-check-sections -Wl,--gc-sections -u call_user_start -Wl,-static -Wl,--start-group -lc -lgcc -lhal -lphy -lpp -lnet80211 -llwip -lwpa -lmain -lespnow -lcrypto user/.output/eagle/debug/lib/libuser.a -Wl,--end-group -o .output/eagle/debug/image/eagle.app.v6.out
8
9
!!!
10
No boot needed.
11
Generate eagle.flash.bin and eagle.irom0text.bin successully in folder bin.
12
eagle.flash.bin-------->0x00000
13
eagle.irom0text.bin---->0x10000
14
!!!
15
make[1]: Leaving directory '/mnt/c/Users/Standardbenutzer/Documents/ESP8266/Projects/ESP8266'
1
SDK ver: 3.1.0-dev(f18b6d4) compiled @ Jan  2 2019 15:05:05
2
phy ver: 1136_0, pp ver: 10.2
3
4
Hello World
5
mode : softAP(a2:20:a6:02:57:2a)
6
add if1
7
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
8
bcn 100

: Bearbeitet durch User
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.