Forum: Mikrocontroller und Digitale Elektronik HEW mit M16C und Linkproblemen


von Ratloser Student (Gast)


Lesenswert?

Hi,

ich programmiere zur Zeit ein M16C für eine Anlagensteuerung und das 
Programm läuft soweit auch. Nun bin ich dabei meinen Source in mehrere 
Dateien aufzuteilen und dann zusammen zu linken, mit dem Ergebnis das 
der Linker mir folgenden Fehler ausspuckt: xyz is multiple defined.

Beispielcode:
1
main.c:
2
#include "sfr.h"
3
#include "main.h"
4
#include "display.h"
5
#include "timer.h"
6
7
void main(void){
8
...
9
};
10
11
sfr.h:
12
#ifndef _SFR_H
13
 #define _SFR_H
14
 #include "sfr245.h"
15
 ...Ergänzungen zum sfr...
16
#endif
17
18
main.h:
19
#ifndef _MAIN_H
20
 #define _MAIN_H
21
 extern char display;
22
 extern char timer;
23
#endif
24
25
display.h:
26
#ifndef _DISPLAY_H
27
 #define _DISPLAY_H
28
 char display;
29
#endif
30
31
timer.h:
32
#ifndef _TIMER_H
33
 #define _TIMER_H
34
 char timer;
35
#endif
36
37
display.c:
38
#include "sfr.h"
39
#include "timer.h"
40
41
timer.c:
42
#include "sfr.h"
43
#include "timer.h"

Das Gemecker des Linkers bezieht sich offensichtlich auf Variablen die 
im sfr245.h deklariert sind und auch logischerweise für jede .c Datei 
eingebunden werden, warum das aber ein Problem beim Linken ist, verstehe 
ich nicht. Im AVR-Studio hatte ich noch nie Probleme mit sowas...

Ich hoffe es kann jemand helfen.
Danke

von Ratloser Student (Gast)


Lesenswert?

Natürlich hab ich ganz vergessen womit ich überhaupt programmiere:

High-performance Embedded Workshop (HEW) 4.04

von Analog (Gast)


Lesenswert?

deklariere sie mal als extern.

extern char xyz;

von Martin (Gast)


Lesenswert?

Hallo,

als Vorlange/Beispiel könntest du mal unter

http://martinsuniverse.de/projekte/audiohplayer/audiohplayer.html

nachschauen. Da ist ein Project mit einem M16C und kompletten Sourcen.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Vorschlag für Änderungen sind so markiert: // ###
1
main.c:
2
#include "sfr.h"
3
#include "main.h"
4
#include "display.h"
5
#include "timer.h"
6
7
int main(void){ // ###
8
...
9
};
10
11
sfr.h:
12
#ifndef _SFR_H
13
 #define _SFR_H
14
 #include "sfr245.h"
15
 ...Ergänzungen zum sfr...
16
#endif
17
18
main.h:
19
#ifndef _MAIN_H
20
 #define _MAIN_H
21
 // ###
22
#endif
23
24
display.h:
25
#ifndef _DISPLAY_H
26
 #define _DISPLAY_H
27
 extern char display; // ###
28
#endif
29
30
timer.h:
31
#ifndef _TIMER_H
32
 #define _TIMER_H
33
 extern char timer; // ###
34
#endif
35
36
display.c:
37
#include "sfr.h"
38
#include "display.h" // ###
39
#include "timer.h"
40
char display; // ###
41
42
timer.c:
43
#include "sfr.h"
44
#include "timer.h"
45
char timer; // ###

von Ratloser Student (Gast)


Lesenswert?

@Stefan B.

Dein geposte gtägt genau garnix zur Probemlösung bei.
Der Rückgabewert der Main ist bei einem Mikrocontroller sowas von egal
und ob die Variablen im Header nur deklariert oder auch gleich definiert 
werden ist sowas von wumpe. Und das extern im Header macht hierbei 
überhaupt keinen Sinn.

von Ratloser Student (Gast)


Lesenswert?

Aber ein Treffer hast du schon, klar soll in der display.c auch die 
display.h includiert werden war halt ein copy&paste-Fehler meinrseits 
beim zusammen wursten des Beispiels.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ratloser Student wrote:

> Dein geposte gtägt genau garnix zur Probemlösung bei.

plonk

von Judge (Gast)


Lesenswert?

>> ...und ob die Variablen im Header nur deklariert oder auch gleich
>> definiert werden ist sowas von wumpe.

Ist es nicht. Wenn Variablen im Header definiert werden wird für jede 
C-Datei, die den Header einbindet, eine eigene Variable erstellt, sofern 
sie nicht vom Compiler z.B. wg. nicht-Benutzung wegoptimiert wird.
Der Linker generiert dann einen Fehler, da mehrere unterschiedliche 
Variablen mit identischem Namen existieren.

So wie Stefan B. es vorgeschlagen hat, ist auf jeden Fall eine korrekte 
Lösung für Dein Problem.

Gruß
Judge

von Ratloser Student (Gast)


Lesenswert?

Wenns nur immer so einfach wäre Leute wie dich loszuwerden.

von Ratloser Student (Gast)


Lesenswert?

Langsam verstehe ich das Problem hier im Board.

>So wie Stefan B. es vorgeschlagen hat, ist auf jeden Fall eine korrekte
>Lösung für Dein Problem.

Ist es eben nicht, für meine Variablen im Header hat weder der Compiler 
noch der Linker auch nur eine Warnung über, es ist im schlichtweg egal. 
Das Problem beim Linken wird AUSSCHLIEßLICH durch Definitionen in der 
sfr245.h (mitgelieferten Header-Datei) verursacht, wenn ich diese aussen 
vor lasse, entsprechende Stellen auskommentiere, linkt er das Ding 
anstandslos. Es gibt dann nicht eine einzige Warnung geschweige denn 
einen Fehler. Nur wenn ich das Ding eben mehrfach einbinde, was ich 
leider wegen einiger Port definitionen muss, krachts. Was ansich auch 
klar ist weil dort sowohl structs als auch Variablen mehrfach definiert 
werden. Auf der anderen Seite sollte es aber auch funktionieren ohne das 
verdammte Ding komplett umzuarbeiten, da es so mit dem Board/Controller 
geliefert wurde und sonst auch einfach nur immer eingebunden wird. 
Andere IDEs schaffens ja auch (AVR-Studio und co).

von Judge (Gast)


Lesenswert?

>> Langsam verstehe ich das Problem hier im Board.
Ja, wenn die Schwierigkeiten nicht klar aufzeigt werden, muss man sich 
nicht wundern wenn die Antworten nicht den Erwartungen entsprechen.

>> Das Problem beim Linken wird AUSSCHLIEßLICH durch Definitionen in der
>> sfr245.h (mitgelieferten Header-Datei) verursacht,...
Dann schreib' das doch bitte auch gleich und setze keine überflüssigen 
Variablen in den Beispiel-Code die nichts mit dem Problem zu tun haben. 
Ich bin in erster Linie ebenfalls davon ausgegangen das im sfr245.h 
eigene Variablen deklariert wurden.

>> Andere IDEs schaffens ja auch (AVR-Studio und co).
Auch diese kann es. Allerdings verursacht obiger Beispielcode wohl eher 
keine Probleme (ich sehe zumindest keine abgesehen von den oben bereits 
genannten).
Solche Linker-Fehler kommen daher, wenn das Header-File beispielsweise 
mehrfach für ein C-File eingebunden wird falls Dir das weiterhilft.

Und entschuldige bitte meinen zweiten Versuch zu helfen - kommt 
hoffentlich nicht wieder vor.

Gruß
Judge

von Martin (Gast)


Lesenswert?

@Ratloser Student
hast du dir mal den Quellcode von meinem Projekt angeschaut? Ich 
verwende die sfr*.h auch in mehreren anderen *.c Dateinen. Das Projekt 
wird jedenfalls ohne Fehler compiliert.

von Ratloser Student (Gast)


Lesenswert?

@Judge:
Ich dachte

>Das Gemecker des Linkers bezieht sich offensichtlich auf Variablen die
>im sfr245.h deklariert sind und auch logischerweise für jede .c Datei
>eingebunden werden, warum das aber ein Problem beim Linken ist, verstehe
>ich nicht. Im AVR-Studio hatte ich noch nie Probleme mit sowas...

im Erstpost wäre anich eine relativ genaue Problembeschreibung.

Ich hab mal testweise alle eigenen definitionen/deklarationen aus allen 
.c und .h Dateien entfernt und include nur die sfr245.h in allen .c 
Dateien des Projektes. Ergebnis: Der Linker ist immer noch am mosern, 
über die gleichen multiple defines und btw. mehrfaches einbinden in 
EINER .c Datei wird natürlich über #ifndef Konstrukte verhindert (was 
aber in dieser Konstellation eh nicht vorkommen kann).


>Und entschuldige bitte meinen zweiten Versuch zu helfen - kommt
>hoffentlich nicht wieder vor.

Versteh mich nicht falsch, ich will sicher nicht als der totale 
Kotzbrocken rüber kommen, nur bekomme ich hier im Board echt die Kriese 
wenn ich manche Postings lese, die teilweise den Eindruck vermitteln als 
ob sie nichtmal den Text der OP gelesen haben. Stattdessen kommen immer 
die üblichen unsachdienlichen Kommentare:

Über generellen aufbau von Funktionen (wobei es offensichtlich ist das 
das Problem nicht daher kommt.
Über Bildformate.
Über Einfordern von Quelltexten (wobei das eigentliche Problem längst 
klar ist)
Über Formatierungen desselbigen.
Über Verwendung des internen Oszillators, speziell bei AVR und RS232, 
wobei es ansich meistens die Kondensatoren des MAX sind.
Über Rückgabewerte der Main
usw usw usw.

Bitte nicht überlnehmen aber sowas nervt extrem.
Und ja, ich verzichte gerne auf die Hilfe entsprechender Personen, da 
diese idr eh nichts konstruktives beitragen.
(bist nicht du gemeint, sonder allgemein)


@Martin:
Werde ich am Wochenende mal genauer in Augenschein nehmen, hatte bislang 
nicht die Zeit dafür, aber danke schonmal.

von AndreasU (Gast)


Lesenswert?

@Martin

:) hab mir mal deinen Code gesaugt. Gefällt mir sehr gut. Danke dafür! 
Werde gucken ob ich etwas daraus lernen kann.

von Martin (Gast)


Lesenswert?

Die Komentare stimmen aber nicht alle zu 100% ;-) halt ab und zu ein 
bissl copy & waste

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.