www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik HEW mit M16C und Linkproblemen


Autor: Ratloser Student (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
main.c:
#include "sfr.h"
#include "main.h"
#include "display.h"
#include "timer.h"

void main(void){
...
};

sfr.h:
#ifndef _SFR_H
 #define _SFR_H
 #include "sfr245.h"
 ...Ergänzungen zum sfr...
#endif

main.h:
#ifndef _MAIN_H
 #define _MAIN_H
 extern char display;
 extern char timer;
#endif

display.h:
#ifndef _DISPLAY_H
 #define _DISPLAY_H
 char display;
#endif

timer.h:
#ifndef _TIMER_H
 #define _TIMER_H
 char timer;
#endif

display.c:
#include "sfr.h"
#include "timer.h"

timer.c:
#include "sfr.h"
#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

Autor: Ratloser Student (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Natürlich hab ich ganz vergessen womit ich überhaupt programmiere:

High-performance Embedded Workshop (HEW) 4.04

Autor: Analog (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
deklariere sie mal als extern.

extern char xyz;

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

als Vorlange/Beispiel könntest du mal unter

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

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorschlag für Änderungen sind so markiert: // ###

main.c:
#include "sfr.h"
#include "main.h"
#include "display.h"
#include "timer.h"

int main(void){ // ###
...
};

sfr.h:
#ifndef _SFR_H
 #define _SFR_H
 #include "sfr245.h"
 ...Ergänzungen zum sfr...
#endif

main.h:
#ifndef _MAIN_H
 #define _MAIN_H
 // ###
#endif

display.h:
#ifndef _DISPLAY_H
 #define _DISPLAY_H
 extern char display; // ###
#endif

timer.h:
#ifndef _TIMER_H
 #define _TIMER_H
 extern char timer; // ###
#endif

display.c:
#include "sfr.h"
#include "display.h" // ###
#include "timer.h"
char display; // ###

timer.c:
#include "sfr.h"
#include "timer.h"
char timer; // ###

Autor: Ratloser Student (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ratloser Student (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ratloser Student wrote:

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

plonk

Autor: Judge (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ratloser Student (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenns nur immer so einfach wäre Leute wie dich loszuwerden.

Autor: Ratloser Student (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Judge (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ratloser Student (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: AndreasU (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Martin

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

Autor: Martin (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.