cpp unter freetz komplieren

hanske

Neuer User
Mitglied seit
26 Mai 2010
Beiträge
11
Punkte für Reaktionen
0
Punkte
0
Hi,

ich versuche gerade cpp code unter freetz zu kompilieren.
Leider funktioniert das nur mit dem nativen Kompiler nicht aber mit dem "mipsel-gcc".
Wahrscheinlich ist mein Makefile falsch. Da bin echter Anfänger.
Code:
CC="mipsel-linux-g++"
LD = ld
CFLAGS="-Os -pipe -march=4kc -Wa,--trap"
CPP ="mipsel-linux-g++"
CPPFLAGS =
EXE = Grab
SRCS=Grab.cpp
OBJS = Grab.o
LIBS=  
	
all: $(OBJS)
	$(CC) -o $(EXE) $(OBJS) $(LIBS)
clean:
	rm -f $(EXE) $(OBJS)

Ich bekomme immer Fehler beim Linken:

/home/freetz/freetz-1.1.3/toolchain/build/gcc-4.2.1-uClibc-0.9.28/mipsel-linux-uclibc/bin-ccache/../lib/gcc/mipsel-linux-uclibc/4.2.1/../../../../mipsel-linux-uclibc/bin/ld: Grab.o: Relocations in generic ELF (EM: 3)
Grab.o: could not read symbols: File in wrong format

Mein PATH verweist auf .../toolchain/target/bin
Das Freetz Paket hatte ich vorher schon erfolgreich durchkompiliert.
Die Libs müssten daher für den Mipsel gebaut sein.

Danke für eure Hilfe
 
Auch mit Hilfe der anderen Makefiles bin ich nicht weitergekommen.
Die sind meist sehr umfangreich. Für ein einzelnes cpp sollte es doch ganz einfach sein, oder?
Ein "C"-File kompiliert bei mir problemlos für beide Plattformen, aber "Cpp" kompiliert nur nativ.
Hat keine ein einfaches Beispiel Makefile?

Danke und Grüße
 
Wie gesagt bin ich Laie bei Makefiles.
Ich würde es so interpretieren:
Alle Objectdateien sollen mit dem "mipsel-linux-g++" kompiliert werden.
Der Linker wird wohl dadurch ebenfall implizit aufgefordert die angegeben EXE zu erzeugen.
Also kompilieren und linken, was braucht man mehr? Bei Standard C und nativ geht es ja auch.
Evtl. fehlen mir ja auch noch Libs, aber dann hätte ich eine andere Fehlermeldung erwartet.
Ich hab auch schon folgendes probiert, weil ich nicht wusste ob die CFLAGS sonst ankommen.
Code:
all: $(OBJS)	
	$(CC) $(OBJS) $(CFLAGS) $(LDFLAGS) -o $(EXE) $(LIBS)
 
Ich hatte Dir empfohlen, darauf zu achten, welche Kommandos ausgeführt werden.

Noch mehr kann ich Dir empfehlen, die Dokumentation zu make zu lesen und diese mit Deiner Interpretation zu vergleichen.
 
Ok, jetzt gehts.
Die Objects müssen da wohl gar nicht in den Aufruf.
Den Mist habe ich mir bei den anderen abgeguckt.
Nur seltsam das es mit dem nativen Kompiler funktioniert, da erwartet man den Fehler ganz woanders.

So geht jetzt bei mir:

Code:
$(EXE): $(OBJS)
	$(CC) $(CFLAGS) $(LDFLAGS) -o $(EXE) $(SRCS) $(LIBS)
 
Seltsam ist an dem Ganzen nur, daß Du noch immer nicht auf die Empfehlungen von weiter oben eingegangen bist.

Schön, daß jetzt das gewünschte Ergebnis bei Dir herauskommt, aber dafür brauchst Du kein make mehr, da würde es auch ein einfaches Skript tun.
 
Die Empfehlung war doch bei den anderen zu gucken!?
Daher hatte ich ja den Fehler importiert.
Oder was meinst Du genau?
Die Doku hatte ich nun soweit gelesen bis ich den Fehler gefunden hatte.
Makefile statt Skript ist schon ok. Das Projekt wird ja sicher noch größer.
 
Ich meinte die Empfehlung aus #6, zu schauen, welche Kommandos von make ausgeführt werden und die Dokumentation von make zu lesen. Der Fehler ist schon in #1 drin.

Ich weiß, daß make Vorteile hat bei größeren Projekten. Aber in der Form, die Du jetzt hast, wird make immer alle Dateien neu übersetzten, und dann hat es keine Vorteile gegenüber einem Skript, das genau das Gleiche tut.

Du hast keine Fehler importiert, und Du hast keinen Fehler gefunden. Du hast eine Änderung gemacht, die die Funktionalität von make deaktiviert, aber dazu führt, daß der ursprüngliche Fehler überdeckt wird und ein funktionierendes Programm erstellt wird. Wenn das Dein Ziel war, dann hast Du es geschafft.
 
Dann hab ich es wohl tatsächlich nicht verstanden was falsch war (ist).
Das erste (falsche) makefile war übrigens auch schon aus dem Freetzpackage importiert
 
Das erste Makefile sieht nicht nach einem Freetz-Makefile aus. Allenfalls nach einem Makefile von einem der unterstützten Programme, und auf die haben wir keinen Einfluß. Was genau ist denn die Quelle dafür?

Und hast Du schon mal versucht, dem weiter nachzugehen, oder ist es Dir nicht mehr so wichtig?
 
Das Beispiel kam aus wput. Wahrscheinlich habe ich aber zu viel weggelassen. Ich wollte es halt vereinfachen.
Code:
#wput.mk
#mm make file for wput
SHELL=/bin/bash
prefix=/usr
bindir=/usr/bin
localedir=$(prefix)/share/locale
CC=/home/freetz/freetz-1.1.3/toolchain/target/bin/mipsel-linux-uclibc-gcc
CFLAGS= -Os -pipe -march=4kc -Wa,--trap -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Wall  -g -DLOCALEDIR=\"$(localedir)\" 
LIBS=  
EXE=../wput
GETOPT=
MEMDBG=
OBJ=wput.o netrc.o ftp.o ftplib.o utils.o progress.o socketlib.o queue.o ftp-ls.o $(GETOPT) $(MEMDBG)
HEAD=wput.h netrc.h ftp.h ftplib.h utils.h progress.h socketlib.h _queue.h windows.h config.h constants.h

all: wput

wput.o ftp.o queue.o: $(HEAD)
$(OBJ): utils.h windows.h constants.h config.h
socketlib.o: socketlib.h
progress.o: progress.h
ftplib.o: socketlib.h ftplib.h
ftp-ls.o: ftp.h wget.h url.h

wput:   $(OBJ)
	$(CC) -o $(EXE) $(OBJ) $(LIBS)
clean:
	rm -f *.o *~ *.bak ../wput getopt/*.o
win-clean: clean
	rm -r msvcpp/[Dd]ebug msvcpp/[Rr]elease ../wput.exe

Ich werde die Doku vom Makefile auf jeden Fall noch weiter durcharbeiten.
Da mein Source nun aber zum ersten mal läuft habe ich dort eine noch größere Baustelle und leider nicht viel Zeit.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.