cc: "undefined reference"

vimix

Teuflisch
Hallo,
ich wollte es ja vermeiden diese Frage hier stellen zu muessen aber irgendwie mach ich was falsch und ich gebe auf :huth: -> mich.

Lib mit test-funktion wird erstellt und installiert. Makefile:
Code:
CFLAGS=-g -Wall -pedantic -fPIC --std=c99

all: static dynamic
dynamic: linkedList
	cc -shared -Wl,-soname,libAlgoDat.so.0 -o libAlgoDat.so.0.0.1 linkedList.o
static: linkedList 
	ar rcs libAlgoDat.a linkedList.o
linkedList: linkedList.c linkedList.h
	cc -c -fPIC linkedList.c -o linkedList.o
install:
	cp libAlgoDat.a /usr/lib/libAlgoDat.a
	cp libAlgoDat.so.0.0.1 /usr/lib/libAlgoDat.so.0.0.1
	mkdir /usr/include/AlgoDat
	cp *.h /usr/include/AlgoDat/
deinstall:
	rm -r /usr/include/AlgoDat
	rm /usr/lib/libAlgoDat.a
	rm /usr/lib/libAlgoDat.so.0.0.1
reinstall: deinstall install
clean:
	rm *.o

.PHONY: all dynamic static install deinstall reinstall clean

TestProgramm welche test() aufruft: Makefile
Code:
LIBS = AlgoDat

AlgoDatTest: main.c
	#echo $(LIBS)
	#echo $(addprefix -l, $(LIBS))
	cc -I/usr/include/AlgoDat/ -L/usr/lib -lAlgoDat main.c -o AlgoDatTest
Die echos sind eine andere Baustelle. Ich weiss nicht warum, aber addprefix liefert nur "" zurueck.

Beim bauen bekomme ich den Fehler:
Code:
/var/tmp//cc5rMG1W.o(.text+0x2e): In function `main':
: undefined reference to `test'
Die lib wird jedoch gefunden (sonst wuerde ich ja einen dementsprechenden Fehler bekommen).

nm sagt auch dass test() da ist. Warum kann der Linker test() trotzdem nicht finden?

Tja, ich habe mich bisher immer auf das Buildsystem von Eclipse verlassen. Jetzt dachte ich mir, ich sollte mal meine Zeit nutzen und mich anstaendig mit make und co beschaeftigen und jetzt bin ich verlassen. :)

System: FreeBSD 8.1

Danke und lg
vimix
 
Code:
LIBS = AlgoDat

AlgoDatTest: main.c
	#echo $(LIBS)
	#echo $(addprefix -l, $(LIBS))
	cc -I/usr/include/AlgoDat/ -L/usr/lib -lAlgoDat main.c -o AlgoDatTest
stell mal das -lAlgoDat nach ganz hinten, also so:

Code:
LIBS = AlgoDat

AlgoDatTest: main.c
	#echo $(LIBS)
	#echo $(addprefix -l, $(LIBS))
	cc -I/usr/include/AlgoDat/ -L/usr/lib main.c -o AlgoDatTest  -lAlgoDat
 
Ich rate jetzt mal ins Blaue:
Symbolic Link in /usr/lib mit Namen libAlgoDat.so und Ziel libAlgoDat.so.0.0.1
anlegen?

Irgendwie hab ich was im Hinterkopf, dass -lAlgoDat die Abkürzung von libAlgoDat.so ist.

HTH,
Döna
 
Ja, genau das ist das Problem. Der Symlink muss allerdings nicht nach /usr/lib, es kann auch jedes andere Verzeichnis sein, wenn man es denn dem Linker mitteilt.
 
Meinte ja nur in Bezug auf:
Code:
cc -I/usr/include/AlgoDat/ -L/usr/lib -lAlgoDat main.c -o AlgoDatTest

Genausowenig muss er seine Header nach /usr/include/AlgoDat legen! :belehren:
 
@toor
Tatsaechlich. Es war die Reihenfolge der Parameter. Ich muss mir die man page noch einmal genauer durchlesen und schauen ob es dort einen Hinweis gibt.

Danke fuer den Hinweis, dass der Link fehlt, den habe ich vergessen. Ich weiss, dass ich meine Lib/Includes nicht nach /usr/lib bzw. /usr/include legen muss, aber es scheint mir der richtige Ort zu sein.
 
ja, ich stolpere auch öfters darüber :)

aus der manpage:
...
It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, `foo.o -lz bar.o' searches library `z' after file foo.o but before bar.o. If bar.o refers to functions in `z', those functions may not be loaded. ...

Nur aus Neugierde:
du baust die Datenstrukturen aus Algodat (ich nehm mal an die VL an der TU Wien) in C nach?
 
ja, ich stolpere auch öfters darüber :)

aus der manpage:


Nur aus Neugierde:
du baust die Datenstrukturen aus Algodat (ich nehm mal an die VL an der TU Wien) in C nach?

Danke fuers raussuchen. Ich hatte bisher wohl Glueck, da ich den Fehler bisher noch nie hatte.

So aehnlich. :D
Ich baue tatsaechlich die Datenstrukturen aus Algodat fuer die VL an der TU Wien um mein C wieder etwas aufzufrischen. Hab die VL aber erst naechstes Semester. Auch von der TU?
 
hab ichs doch gewusst

ja, bin auch auf der TU, Algodat hab ich schon hinter mir, Algodat2 noch vor mir :P
 
Zurück
Oben