amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > OS4 SDK mit SDL: Undefined references [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

11.12.2010, 21:03 Uhr

Reth
Posts: 1812
Nutzer
Hallo zusammen,

probiere gerade meinen SDL port manuell mit Hilfe des Porting Guides. Leider noch erfolglos. Der Linker findet wohl keine libs, obwohl ich alle angegeben habe. Hier mal das makefile:
C code:
CC=g++
CCFLAGS=-O2 -Wall -I. -ISDK: -ISDK:Local/newlib/include/SDL/ -ISDK:Local/common/include/SDL/
CFILES=game.cpp gamestate.cpp gui.cpp image.cpp main.cpp panel.cpp player.cpp resource.cpp screen.cpp sector.cpp sound.cpp utils.cpp
HFILES=game.h gamestate.h gui.h image.h panel.h player.h resource.h screen.h sector.h sound.h utils.h
OFILES=game.o gamestate.o gui.o image.o panel.o player.o resource.o screen.o sector.o sound.o utils.o main.o
APP=gigalomania
INC=
LINKPATH=-LSDK:Local/newlib/lib
LIBS=-lSDLmain -lSDL -lSDL_image -lSDL_mixer

all: $(APP)

$(APP): $(OFILES) $(HFILES) $(CFILES)
	$(CC) $(CCFLAGS) $(LINKPATH) $(LIBS) -o $(APP) $(OFILES)

.cpp.o:
	$(CC) $(CCFLAGS) -O2 $(INC) -c $<

clean:
	rm -rf *.o
	rm $(APP)



Die .a-Files sind alle da, dennoch meckert gmake hier:
C code:
game.o: In function 'createAlphaShadows(Image*, int, int)':
game.cpp:(.text+0x1f38): undefined reference to 'SDL_LockSurface'

und noch viele mehr!

Was fehlt denn noch bei den Linkerangaben?

Danke schon mal!

Ciao

[ - Antworten - Zitieren - Direktlink - ]

12.12.2010, 07:49 Uhr

ZeroG
Posts: 1486
Nutzer
@Reth:
Versuch mal die reinfolge in der die Linklibs angeben sind zu verändern.

[ - Antworten - Zitieren - Direktlink - ]

12.12.2010, 09:10 Uhr

Reth
Posts: 1812
Nutzer
@ZeroG:
Hatte ich schon probiert. Gleiches Resultat!

[ - Antworten - Zitieren - Direktlink - ]

13.12.2010, 10:50 Uhr

Thore
Posts: 2266
Nutzer
Wenn Du die Includes und die Libs richtig eingebunden hast, aber immer noch undefined References kommt, passen deine LinkLibs von der Version des Compilers nicht.
Hol Dir mal die SDL Sourcen und bau die Libs mit deiner gcc Version neu.
Probier dann deine selbstgebauten Libs aus.

Gleiches Problem hatte ich auch woanders, recompile war die Lösung bei mir.

(PS: Identischer Beitrag zu beiden Fragen von Dir)

[ - Antworten - Zitieren - Direktlink - ]

28.12.2010, 18:29 Uhr

Reth
Posts: 1812
Nutzer
Habe nun mal sämtliche SDL libs aus dem OS4Depot neu geholt und installiert, bekomme immer noch tonnenweise Fehlermeldungen, die ich nicht nachvollziehen kann!

Z.B.:
C++ code:
obj/game.opp: In function 'std::__verify_grouping(char const*, unsigned int, std::string const&)':
game.cpp:(.text+0x28c): undefined reference to 'std::string::size() const'
game.cpp:(.text+0x2ec): undefined reference to 'std::string::operator[](unsigned int) const'
game.cpp:(.text+0x364): undefined reference to 'std::string::operator[](unsigned int) const'
game.cpp:(.text+0x3f0): undefined reference to 'std::string::operator[](unsigned int) const'


Was will mir denn der Linker damit sagen? Dass er kein C++ kann? In game.h gibt es unter anderem:
C++ code:
#include <string>
using std::string;


Und game.h wird in game.cpp included, woraus game.o gemacht wird! Liegt das am makefile? Hier mal das komplette:
C++ code:
#
# Makefile generated by:
# CodeBench 0.13
#
# Project: GigaLoMania
#
# Created on: 25-11-2010 22:54:29
#
#

CC = SDK:gcc/bin/gcc

OBJ_DIR = obj

OBJ = \
	 $(OBJ_DIR)/game.opp $(OBJ_DIR)/gamestate.opp $(OBJ_DIR)/gui.opp \
	 $(OBJ_DIR)/image.opp $(OBJ_DIR)/main.opp $(OBJ_DIR)/panel.opp \
	 $(OBJ_DIR)/player.opp $(OBJ_DIR)/resource.opp $(OBJ_DIR)/screen.opp \
	 $(OBJ_DIR)/SDL_main.o $(OBJ_DIR)/sector.opp $(OBJ_DIR)/utils.opp
# -- Original	 $(OBJ_DIR)/sound.opp \
# -- Original	 $(OBJ_DIR)/utils.opp

BIN = GigaLoMania

INCPATH = -I. -Iheader -ISDK: -ISDK:Local/newlib/include/SDL/ -ISDK:Local/common/include/SDL/

CFLAGS = -Wall $(INCPATH)

LDFLAGS = 

LIBS = -lSDL #-lSDL_image
#	add any extra linker libraries you want here

.PHONY: all all-before all-after clean clean-custom

all: all-before $(BIN) all-after

all-before:
#	You can add rules here to execute before the project is built

all-after:
#	You can add rules here to execute after the project is built

clean: clean-custom
	rm $(OBJ) $(BIN)

$(BIN): $(OBJ)
	$(CC) $(OBJ) $(LIBS) -o $(BIN) $(CFLAGS) $(LDFLAGS)

$(OBJ_DIR)/game.opp: src/game.cpp
	$(CC) -c src/game.cpp -o $(OBJ_DIR)/game.opp $(CFLAGS)

$(OBJ_DIR)/gamestate.opp: src/gamestate.cpp
	$(CC) -c src/gamestate.cpp -o $(OBJ_DIR)/gamestate.opp $(CFLAGS)

$(OBJ_DIR)/gui.opp: src/gui.cpp
	$(CC) -c src/gui.cpp -o $(OBJ_DIR)/gui.opp $(CFLAGS)

$(OBJ_DIR)/image.opp: src/image.cpp
	$(CC) -c src/image.cpp -o $(OBJ_DIR)/image.opp $(CFLAGS)

$(OBJ_DIR)/main.opp: src/main.cpp
	$(CC) -c src/main.cpp -o $(OBJ_DIR)/main.opp $(CFLAGS)

$(OBJ_DIR)/panel.opp: src/panel.cpp
	$(CC) -c src/panel.cpp -o $(OBJ_DIR)/panel.opp $(CFLAGS)

$(OBJ_DIR)/player.opp: src/player.cpp
	$(CC) -c src/player.cpp -o $(OBJ_DIR)/player.opp $(CFLAGS)

$(OBJ_DIR)/resource.opp: src/resource.cpp
	$(CC) -c src/resource.cpp -o $(OBJ_DIR)/resource.opp $(CFLAGS)

$(OBJ_DIR)/screen.opp: src/screen.cpp
	$(CC) -c src/screen.cpp -o $(OBJ_DIR)/screen.opp $(CFLAGS)

$(OBJ_DIR)/SDL_main.o: src/SDL_main.c
	$(CC) -c src/SDL_main.c -o $(OBJ_DIR)/SDL_main.o $(CFLAGS)

$(OBJ_DIR)/sector.opp: src/sector.cpp
	$(CC) -c src/sector.cpp -o $(OBJ_DIR)/sector.opp $(CFLAGS)

# -- Original $(OBJ_DIR)/sound.opp: src/sound.cpp
# -- Original	$(CC) -c src/sound.cpp -o $(OBJ_DIR)/sound.opp $(CFLAGS)

$(OBJ_DIR)/utils.opp: src/utils.cpp
	$(CC) -c src/utils.cpp -o $(OBJ_DIR)/utils.opp $(CFLAGS)


Bin echt am Verzweifeln, da ich keine Ahnung hab, was hier los ist! Von diesen Fehlermeldungen gibts noch tausende mehr. Wenn ich SDL_image im makefile wieder aktiviere kommen noch ganz andere hinzu, doch dazu ggf. in einem weiteren Post mehr!

Kann jmd. von euch hier weiter helfen?

Danke schon mal!

Ciao

[ - Antworten - Zitieren - Direktlink - ]

28.12.2010, 18:57 Uhr

ZeroG
Posts: 1486
Nutzer
@Reth:
Mal versucht gegen libstdc++ zu linken?

[ - Antworten - Zitieren - Direktlink - ]

28.12.2010, 19:06 Uhr

Reth
Posts: 1812
Nutzer
@ZeroG:

Klappt leider nicht: Bekomme folgenden Fehler:
C++ code:
SDK:gcc/bin/gcc obj/game.opp obj/gamestate.opp obj/gui.opp obj/image.opp obj/main.opp obj/panel.opp obj/player.opp obj/resource.opp obj/screen.opp obj/SDL_main.o obj/sector.opp obj/utils.opp -lSDL -llibstdc++ -o GigaLoMania -Wall -I. -Iheader -ISDK: -ISDK:Local/newlib/include/SDL/ -ISDK:Local/common/include/SDL/
ld: cannot find -llibstdc++


Die lib ist aber vorhanden (als .so, innerhalb von newlib und in clib2)!
Derzeit nutze ich gmake!

[ Dieser Beitrag wurde von Reth am 28.12.2010 um 19:29 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

28.12.2010, 20:48 Uhr

ZeroG
Posts: 1486
Nutzer
@Reth:
Natürlich klappt das so nicht, ist dir noch nie aufgefallen das du z.B. die libSDL.a mit dem Kommando -lSDL einbindest und nicht mit -llibSDL... :O

[ - Antworten - Zitieren - Direktlink - ]

28.12.2010, 21:14 Uhr

Thore
Posts: 2266
Nutzer
Welche gcc Version hast du?

[ - Antworten - Zitieren - Direktlink - ]

30.12.2010, 14:17 Uhr

gni
Posts: 1106
Nutzer
Zitat:
ZeroG:
@Reth:
Natürlich klappt das so nicht, ist dir noch nie aufgefallen das du z.B. die libSDL.a mit dem Kommando -lSDL einbindest und nicht mit -llibSDL... :O


Und bei Dir funktioniert Deine angegebene -l<...> Option? Wenn ja müßte die Bibliothek bei Dir "liblibSDL.a" heissen (beachte das doppelte lib!). Wenn die Datei jedoch nur "libSDL.a" heißt, dann ist -lSDL vollkommen richtig!

[ - Antworten - Zitieren - Direktlink - ]

30.12.2010, 14:51 Uhr

Thore
Posts: 2266
Nutzer
Ihr lest am besten den ersten Beitrag. Im Makefile steht:
LIBS=-lSDLmain -lSDL -lSDL_image -lSDL_mixer

Sieht für mich korrekt aus. Da hätte der Linker schon gemeckert daß die Libs nicht da wären. Wenn die Libs da sind, und eingebunden, aber trotzdem die Referenzen nicht aufgelöst werden hat das andere Gründe:

1. Die Versionen der Libs ist zu alt oder anders und die Funktionen sind schlichtweg nicht enthalten
2. Die Libs sind für eine andere Maschine (z.B. 68k Libs statt PPC Libs)
3. Die Libs sind mit der eingesetzten gcc Version inkompatibel (z.B. 2.95.3 compilierte Lib auf gcc 4.4.4)
...

[ - Antworten - Zitieren - Direktlink - ]

30.12.2010, 17:17 Uhr

ZeroG
Posts: 1486
Nutzer
@gni:
?( Ich glaube du solltest dir nochmal durchlesen was du da Zitiert hast.

[ - Antworten - Zitieren - Direktlink - ]

30.12.2010, 17:27 Uhr

ZeroG
Posts: 1486
Nutzer
@Thore:
Zitat:
Sieht für mich korrekt aus.
Ist es ja auch.

1: Zu alt werden die nicht sein, aber es wird entweder nicht gegen libstdc++ gelinkt oder der Namespace passt nicht.

2: Da er das zeug aus dem OS4Depot hat ist die wahrscheinlichkeit dafür praktisch bei 0.

3. Sehr unwahrscheinlich - denk dran das es um OS4 geht, da wird der GCC aus dem SDK benutzt und gut. 2.95.3 ist so alt den gab es wahrscheinlich nie für OS4.

[ - Antworten - Zitieren - Direktlink - ]

30.12.2010, 17:28 Uhr

ZeroG
Posts: 1486
Nutzer
@Reth
Ohne Rückmeldungen von dir wird das nix.

[ - Antworten - Zitieren - Direktlink - ]

30.12.2010, 18:53 Uhr

Reth
Posts: 1812
Nutzer
@ZeroG:

Nur Geduld! Komme leider nicht immer dazu! Das Einbinden von -lSDLmain hat schon mal geholfen! Danke!

Allerdings bekomme ich nun aus der Datei SDL_Main.c noch "undefined reference 'SDL_main'". Verstehe ich nicht, da die Lib hinzugelinkt wird und der Include auch angegeben ist!
Woran kann denn das nun noch liegen? Der Compiler gibt schon mal ne Warnung aus, dass SDL_main implizit deklariert wäre! Die Include-Anweisungen müssten aber passen, ein anderes SDL-Bsp. compiliert damit, wird gelinkt und läuft auch!

GCC-Version ist übrigens 4.2.4 für AOS4.

Ciao

[ Dieser Beitrag wurde von Reth am 31.12.2010 um 01:15 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

02.01.2011, 20:53 Uhr

Reth
Posts: 1812
Nutzer
So habe nun mal den Aufruf von SDL_main(...) durch main(...) ersetzt. Das behebt die "undefined reference" auf SDL_main (diese wird eigentlich mittels #define main SDL_main innerhalb von SDL_main.h deklariert, hilft aber nichts, auch wenn das Headerfile mittels #include eingebunden ist)!

main(...) ist innerhalb von main.cpp (ohne eigenes Headerfile definiert), der Aufruf von SDL_main(...) erfolgt in SDL_main.c des Projektes, das ich zu portieren versuche!

Es geht voran!

[ - Antworten - Zitieren - Direktlink - ]

03.01.2011, 08:33 Uhr

gni
Posts: 1106
Nutzer
Zitat:
ZeroG:
@gni:
?( Ich glaube du solltest dir nochmal durchlesen was du da Zitiert hast.

Ups, Du hast recht - tut mir leid. Da war der Satzbau für mich zu kompliziert .-)

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > OS4 SDK mit SDL: Undefined references [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2022 by amiga-news.de - alle Rechte vorbehalten.
.