Forum: Mikrocontroller und Digitale Elektronik Linker ERROR bei U8GLIB auf M32u4


von Martin F. (martin_f70)


Angehängte Dateien:

Lesenswert?

Im Anhang sind meine Makefile sowie meine Main.c zu finden.

Hier ist noch eine kleine Ordnerstruktur:

.
+- makefile
+- main.c
+- lib
 +- u8glib
  +- chessengine.c
  +- u8g.h
  +- ...

Wenn ich nun mein Projekt, so wie es alles ist, durch meine Makefile 
schicke (also »make«), dann gibt's ein paar Fehler:
1
make
2
  CC      main.c
3
  CC      lib/u8glib/chessengine.c
4
5
  [...]
6
7
  CC      lib/u8glib/u8g_u8toa.c
8
  CC      lib/u8glib/u8g_virtual_screen.c
9
  LD      FIRMWARE.ELF
10
./lib/u8glib/chessengine.o: In function `main':
11
/home/tekkkz/Dropbox/workspace/electronics/avr/atmega32/dev/main.c:9: multiple definition of `u8g_setup'
12
main.o:/home/tekkkz/Dropbox/workspace/electronics/avr/atmega32/dev/main.c:9: first defined here
13
/usr/bin/avr-ld: Disabling relaxation: it will not work with multiple definitions
14
./lib/u8glib/chessengine.o: In function `sys_init':
15
/home/tekkkz/Dropbox/workspace/electronics/avr/atmega32/dev/main.c:17: multiple definition of `sys_init'
16
main.o:/home/tekkkz/Dropbox/workspace/electronics/avr/atmega32/dev/main.c:17: first defined here
17
./lib/u8glib/chessengine.o: In function `u8g_prepare':
18
/home/tekkkz/Dropbox/workspace/electronics/avr/atmega32/dev/main.c:22: multiple definition of `u8g_prepare'
19
main.o:/home/tekkkz/Dropbox/workspace/electronics/avr/atmega32/dev/main.c:22: first defined here
20
./lib/u8glib/chessengine.o: In function `u8g_box_frame':
21
/home/tekkkz/Dropbox/workspace/electronics/avr/atmega32/dev/main.c:28: multiple definition of `u8g_box_frame'
22
main.o:/home/tekkkz/Dropbox/workspace/electronics/avr/atmega32/dev/main.c:28: first defined here
23
./lib/u8glib/chessengine.o: In function `u8g_string':
24
/home/tekkkz/Dropbox/workspace/electronics/avr/atmega32/dev/main.c:37: multiple definition of `u8g_string'
25
main.o:/home/tekkkz/Dropbox/workspace/electronics/avr/atmega32/dev/main.c:37: first defined here
26
./lib/u8glib/chessengine.o: In function `u8g_line':
27
/home/tekkkz/Dropbox/workspace/electronics/avr/atmega32/dev/main.c:44: multiple definition of `u8g_line'
28
29
[...]
30
31
./lib/u8glib/u8g_clip.o: In function `u8g_box_frame':
32
main.c:(.text+0xa4): undefined reference to `u8g_DrawStr'
33
main.c:(.text+0xb4): undefined reference to `u8g_DrawBox'
34
main.c:(.text+0xc6): undefined reference to `u8g_DrawBox'
35
main.c:(.text+0xd6): undefined reference to `u8g_DrawStr'
36
main.c:(.text+0xe6): undefined reference to `u8g_DrawFrame'
37
main.c:(.text+0xf6): undefined reference to `u8g_DrawFrame'
38
./lib/u8glib/u8g_clip.o: In function `u8g_string':
39
main.c:(.text+0x112): undefined reference to `u8g_DrawStr'
40
main.c:(.text+0x124): undefined reference to `u8g_DrawStr90'
41
main.c:(.text+0x136): undefined reference to `u8g_DrawStr180'
42
main.c:(.text+0x14a): undefined reference to `u8g_DrawStr270'
43
./lib/u8glib/u8g_clip.o: In function `u8g_line':
44
main.c:(.text+0x162): undefined reference to `u8g_DrawStr'
45
main.c:(.text+0x174): undefined reference to `u8g_DrawLine'
46
main.c:(.text+0x188): undefined reference to `u8g_DrawLine'
47
main.c:(.text+0x19a): undefined reference to `u8g_DrawLine'
48
main.c:(.text+0x1ae): undefined reference to `u8g_DrawLine'
49
./lib/u8glib/u8g_clip.o: In function `u8g_ascii_1':
50
51
[...]
52
53
main.c:(.text+0x26a): undefined reference to `u8g_DrawStr'
54
./lib/u8glib/u8g_virtual_screen.o: In function `main':
55
main.c:(.text.startup+0xc): undefined reference to `u8g_FirstPage'
56
main.c:(.text.startup+0x18): undefined reference to `u8g_NextPage'
57
main.c:(.text.startup+0x38): undefined reference to `u8g_Delay'
58
collect2: error: ld returned 1 exit status
59
makefile:38: recipe for target 'FIRMWARE.ELF' failed
60
make: *** [FIRMWARE.ELF] Error 1

Ich verstehe nicht was das bedeutet/woran das liegt.

Ich hoffe jemand kann mir helfen. Falls ihr noch mehr Informationen oder 
einen Link zu einem Beispielprojekt von U8GLIB haben wollt um meinen 
Fehler zu finden, dann sagt bescheid.

MfG,
Martin

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


Lesenswert?

Was steht in "ug8.h" und warum ist das vor den anderen includes 
eingebunden?

von Martin F. (martin_f70)


Lesenswert?

An der File liegt es nicht, denn mit dem makefile code aus deren 
Examples funktioniert das compilen, siehe hier:
1
$(FIRMWARE).ELF: $(FIRMWARE).a($(OBJS))
2
  $(LINK.o) $(CFLAGS) $(FIRMWARE).a -o $@

Und das hier erzeugt meinen obigen Fehler:
1
$(FIRMWARE).ELF $(FIRMWARE).MAP: $(OBJS)
2
  $(Q)printf "  LD      $(FIRMWARE).ELF\n"
3
  $(Q)$(CC) $(LDFLAGS) $(OBJS) -o $(FIRMWARE).ELF
4
  $(Q)$(SIZ) $(FIRMWARE).ELF
5
6
$(OBJS): $(SRCS)
7
  $(Q)printf "  CC      $(*).c\n"
8
  $(Q)$(CC) $(CFLAGS) -c -o $@ $<

Ich möchte dieses $(LINK.o), was von make definiert ist (s. make -p) 
nicht nutzen, weil es so viel nicht-mutable Output liefert.

Jemand eine Idee wie ich dieses LINK.o zu meinem Stil umschreiben kann?

von Martin F. (martin_f70)


Lesenswert?

Fehler gefunden.

$(Q)$(CC) $(CFLAGS) -c -o $@ $<

das $< am Ende hatte immer nur das erste Element von den $(SRCS) 
übergeben.

Das das niemand gesehen hatte ... echt schade.

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.