Autor Thema: File not found  (Gelesen 4543 mal)

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« am: 21. January 2013, 21:44 »
Ich habe bis jetzt C usw. nur in einem "Compiler+Editor-Paket" genutzt.

Jetzt habe ich mit diesen makefiles so meine Probleme: SRCS = $(shell find -name '*.[cS]') funktioniert nicht, es kommt "File not found", obwohl ich eine .c und eine .S-Datei habe...

Was mache ich falsch?

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 21. January 2013, 22:13 »
Kannst du mal die genaue und vollständige Fehlermeldung und deine Makefile posten?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 21. January 2013, 22:18 »
SRCS = $(shell find -name '*.[cS]')
OBJS = $(addsuffix .o,$(basename $(SRCS)))

CC = gcc
LD = ld

ASFLAGS = -m32
CFLAGS = -m32 -Wall -g -fno-stack-protector -nostdinc
LDFLAGS = -melf_i386 -Ttext=0x100000

kernel: $(OBJS)
$(LD) $(LDFLAGS) -o $@ $^

%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $^

%.o: %.S
$(CC) $(ASFLAGS) -c -o $@ $^

clean:
rm $(OBJS)

.PHONY: clean

Dann kommt das: :(
Z:\Users\C\Desktop\OS\OS>make -f Makefile
File not found - *.[cS]
ld -melf_i386 -Ttext=0x100000 -o kernel
process_begin: CreateProcess(NULL, ld -melf_i386 -Ttext=0x100000 -o kernel, ...)
 failed.
make (e=2): The system cannot find the file specified.
make: *** [kernel] Error 2

Bin schon ganz am Anfang gescheitert :(

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 21. January 2013, 22:32 »
Ich schätze, dass das heißt, dass make deinen ld nicht finden kann. Heißt der wirklich ld und liegt auch im Suchpfad? Wenn du auf der Kommandozeile im gleichen Verzeichnis statt 'make' mal 'ld' eingibst, bekommst du das erwartete Ergebnis?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 21. January 2013, 22:44 »
Danke :) Er heißt ld.exe.

Blöderweise kommt jetzt "No input files"

SRCS = $(shell find -name '*.[cS]')
OBJS = $(addsuffix .o,$(basename $(SRCS)))

CC = gcc.exe
LD = ld.exe

ASFLAGS = -m32
CFLAGS = -m32 -Wall -g -fno-stack-protector -nostdinc
LDFLAGS = -mi386pe -Ttext=0x100000

kernel: $(OBJS)
$(LD) $(LDFLAGS) -o $@ $^

%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $^

%.o: %.S
$(CC) $(ASFLAGS) -c -o $@ $^

clean:
rm $(OBJS)

.PHONY: clean

Z:\Users\C\Desktop\OS\OS>make -f Makefile
File not found - *.[cS]
ld.exe -mi386pe -Ttext=0x100000 -o kernel
ld.exe: no input files
make: *** [kernel] Error 1

Was da los?

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 21. January 2013, 23:13 »
Ich vermute du hast das coreutils-Tool find nicht installiert. Ich glaube die Fehlermeldung "File not found - *.[cS]" kommt vom Windows find. Hast du MSYS installiert? Da sollte es eigentlich dabei sein.
Dieser Text wird unter jedem Beitrag angezeigt.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 21. January 2013, 23:25 »
Puh... wie viel muss man denn da noch installieren? kann ich das nicht einfacher machen? Ohne soeiner file-suche? Es wäre doch erstmal unproblematisch, die ->2<- Dateien da manuell einzutragen...

Nur hab ich keine Ahnung, wie das geht :(

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 21. January 2013, 23:40 »
Manuell kannst du da einfach die Pfade eintragen. Also die SRCS-Zeile so ändern.
SRCS = foo.c bar.S
Make kann auch selbst nach Dateien suchen (aber macht es nicht automatisch in Unterverzeichnissen):
SRCS = $(wildcard *.c *.S)
Unterverzeichnisse musst du selbst angeben:
SRCS = $(wildcard *.c *.S kernel/*.c kernel/*.S etc/*.c etc/*.S)
Oder du beschäftigst dich mit den Makrofunktionen von make

Puh... wie viel muss man denn da noch installieren?
Noch viel mehr. Dein Compiler ist nämlich ein Windows-Compiler (hat PE als Target). Damit kommst du nicht weit. Du brauchst einen Crosscompiler (mit ELF als Target). Den kannst du entweder downloaden oder selbst bauen. Ein Linux tut es auch.
Dieser Text wird unter jedem Beitrag angezeigt.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 21. January 2013, 23:58 »
Gut, das funktioniert schonmal, Danke :)

Hab den Compiler gegen den aus deinem Link einfach mal ausgetauscht, ändert jetzt erstmal nichts an der funktionsweise und daran, dass es immernoch nicht geht, es kommt jetzt nämlich Z:\Users\C\Desktop\OS\OS>make -f Makefile
gcc.exe -m32 -c -o start.o start.S
gcc.exe: CreateProcess: No such file or directory
make: *** [start.o] Error 1

Was mich wundert, denn ich hab nirgendwo "CreateProcess" stehen... ??
Naja, ich mach morgen weiter... danke erstmal für die Hilfe bis jetzt :)

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 22. January 2013, 00:09 »
Das hat nichts mit deinen Source Code zu tun, sondern damit wie ich den Compiler erstellt habe.

Die beste Lösung, die ich kenne, ist nicht gcc.exe (aus dem Verzeichnis i586-elf\bin) zu benutzen, sondern die i586-elf-gcc.exe und so weiter aus dem Verzeichnis bin.

Dieser Text wird unter jedem Beitrag angezeigt.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 22. January 2013, 00:16 »
Kann eigentlich nicht sein, genau die hab ich bereits genommen, ich hab sie nur umbenannt, damit ich den pfad im Makefile nicht umändern musste... es handelt sich um crosstools-complete\bin\i586-elf-gcc.exe  :?

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 22. January 2013, 00:33 »
Die beiden .exe-Dateien sind gleich. Ich glaube die entscheidet anhand des eigenen Namens, wie sie sich verhalten soll. Du solltest deine Makefile anpassen.
Dieser Text wird unter jedem Beitrag angezeigt.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 22. January 2013, 09:47 »
Geht nicht, was mach ich falsch?  :cry:


Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 22. January 2013, 09:57 »
Du darfst die Dateien nicht einfach rüberkopieren, sondern du musst sie in dem entpackten Verzeichnis lassen. Die .EXE-Dateien benötigen nämlich Zugriff auf die anderen Dateien in dem Archiv, und sie suchen relativ zu ihrer eignen Position nach diesen Dateien. Deswegen tritt auch auch der Fehler mit CreateProcess auf: Die Dateien sind nicht da, wo sie i586-elf-gcc.exe erwartet.

Nachdem du die Kommandozeilenumgebung gestartet hast, solltest du SET PATH=C:\crosstools\bin;%PATH% ausführen, wobei du C:\crosstools\bin durch den tatsächlichen Pfad zu dem entpackten bin-Verzeichnis ersetzen musst. Die .EXE-Dateien, die du dir in das Quelltextverzeichnis kopiert hast, solltest du löschen.
Dieser Text wird unter jedem Beitrag angezeigt.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 22. January 2013, 10:08 »
Geil :D

Es geht, habe jetzt kernel, start.o und init.o :)

Ich muss jetzt los, wenn ich wieder da bin, versuch ich, das dann zum Laufen zu bekommen :)

Danke!

 

Einloggen