Hallo Zusammen, ich habe mal wieder ein Problem. Ich habe ein Array in meinem Projekt angelegt und dieses beschrieben und wieder ausgelesen ohne Probleme. Nun wollte ich das auslesen über eine Funktion aufrufen und hebe diese in eine Bibliotek eingebunden. Danach kommt folgender Fehler. *** Error L105 Public Refers to Ignored Segment Symbol: symbol-name Segment: segment-name Wenn ich die *.lib erzeuge kommen keine Fehler alles OK. Wenn ich die Funktion direkt unter main einfüge kommen auch keine Fehler. An was kann das liegen? Tom
Hier noch die Errorliste bei der erstellung der *.lib. wenn ich die beiden Funktionen c_Mittelwert_bestimmen_S2001ID_817a.obj", "c_Mittelwert_bestimmen_S2001IuA_817a.obj" einzeln linke kommt dieser Error nicht?!?!? Gruß Tom
Was mag wohl ERROR L104: MULTIPLE PUBLIC DEFINITIONS bedeuten? Ich habe den Verdacht, daß Du da bei der Libraryerzeugung bzw. Deiner Projektverwaltung irgendwas grundlegendes falsch machst.
JA, aber was ? ich habe alle Variablen und alle Arrays die ich mit dieser Funktion aufrufe mit extern gekennzeichnet. Es werden aber auch noch weitere Variablen angemeckert die ich nur in main verwende. Gruß Tom
Das sieht so aus, als ob Du die Objektdatei zweimal zum Programm linkst - einmal als reine Objektdatei, das zweite Mal verpackt in der Library. Oder hast Du gar ein #include "bla.c" irgendwo stehen?
Ich habe alle include dateien definitionen von Arrays,Variablen etc.In eine Test1.h gepackt und dieses von main includet. Nun habe ich eine Billiothek und alle Funktionen dieser sind in einem Test2.h zusammengefasst. In den Funktionen ist auch zum Teil die Test1.h includet da ich auf die dort definierten Arrays zugreife. Eventuell ist das das Problem das alles über kreuz geht. Aber ich habe keine Ahnung wie ich es sonst lösen kann lass mich aber auch gerne bekehren. Gruß Thomas
Warum willst Du denn unbedingt Bibliotheken selber basteln ? Ist das eine Kundenarbeit und Du willst die Sourcen nicht rausrücken ? Na dann armer Kunde. Wir haben auch mal Software fremdentwickeln lassen und dann gabs massive Bugs und die Entwicklungsfirma gabs nicht mehr. Da wir die Sourcen nicht hatten, mußten wir alles wegschmeißen und nochmal ganz von Null anfangen. Seitdem wird keine externe Arbeit ohne komplette und kommentierte Sourcen inclusive aller Compilereinstellungen und Make-Files mehr akzeptiert. Peter
@Peter, es ist keine Kundenarbeit ich mache gerade eine Technikerarbeit und versuche im Programm eben die ganzen Funktionen über eine Bibliothek aufzurufen. Das hat bis jetzt auch ganz gut geklappt nur als ich diese Funktionen die auf Arrays zugreifen in die Bibliothek einbinden wollte gab es plötzlich diese Fehler. Die Arrays sind im allgemeinen alle gleich aufgebaut nur unterschiedlich groß daher sind auch alle Funktionen ziemlich gleich.Wenn ich nur eine Funktion einbinde kommt kein Fehler beim erstellen der Bibliothek erst bei der zweiten kommt der Fehler siehe Error_lib, beide einzeln einbinden funktionieren.Ich habe nun die Funktionen direkt in mein Programm eingefügt dort funktionieren sie ohne Fehler. Da ich Anfänger bin lasse ich mich gerne von einer Anderen vorgehensweise überzeugen. Gruß Tom
Habe immer noch das Problem. Kann mit jemand eventuell mal ein Beispielprojekt von uvision2 schicken, bei dem die Funktionen anderst als über eine Biblithek eingebunden sind. Habe diese Variante nun schon mehrmals probiert aber immer nur Fehler Fehler Fehler. Danke Tom
Error L104 Multiple Public Definitions Summary *** Error L104 Multiple Public Definitions Symbol: symbol-name Module: filename (module-name) Description The specified public symbol in the specified module is defined in a previously processed file. Copyright (c) Keil Software, Inc. and and Keil Elektronik GmbH. All rights reserved.
Ja und was ist da falsch??? Das der Symbolname mehrmals definiert ist ist mir auch klar. Leider kann ich keine Möglichkeit finden es nur einmal zu definieren. Steht es 2x mit includet bringt es diesen Fehler Komentiere ich es in einem File aus bringet es den Fehler Variablen nicht definiert. UND JETZT !!!!!!!!!!!!!!!!!!! Keil Home Page liefert nicht das geringste Beispiel wie in einem solchen fall zu deklarieren ist. TOM
Zitiere doch mal den Ausschnitt aus Deiner Headerdatei, in der Du dieses Symbol deklarierst/definierst. Wie man in diesem Fall vorzugehen hat, habe ich bereits am 15.9. gepostet, aber das kann ich Dir anhand eines Beispiels auch gerne nochmal zeigen. Keil ist nicht dafür zuständig, die Grundlagen der C-Programmierung zu dokumentieren.
Es ist gar nicht schön, zwischen verschiedenen Threads umherzuspringen. Bleibe bei einem Thread, dann kann man auch verfolgen, was bisher gesagt wurde. Ich hab jedenfalls keine Lust, alles nochmal zu sagen. Peter
@ Rufus, ich schicke sie Dir gerne mal per Mail zu nur hier möchte ich sie recht ungern posten. Schick mir Deine Adresse per Mail und ich schicke Dir File zu. Gruß Tom
Ein Ausschnitt mit der Deklaration exakt einer Variablen genügt. Daher gibt's keine Email-Adresse; vielleicht stolpert ja auch mal wer anderes über das Problem und kann aus diesem Thread sinngebendes entnehmen.
OK! Hier Deklaration eines Arrays xdata int MS2001IuA0 [6][3]; xdata int S2001IuA [500][6]; unsigned char MS2001ID_z=0,MS2001IuA0_z=0,MS2001IuA1_z=0, MS2001IuA2_z=0,MS2001IuA3_z=0,MS2001IuA4_z=0; //Zeilenzähler für Zwischenspeicher Array unsigned char S2001IuA5_z=0,MS2001IuA6_z=0,MS2001IuA7_z=0, MS2000R_z=0,MS2000W1_z=0; habe es auch mir extern probiert ohne erfolg. Wie gesagt das Problem schein zu sein dass ich von main und von der Libruaryfunktion auf diese Arrays etc. zugreife. Hast Du eventuell ein Beispiel Projekt wie dieses Aufgebaut ist wenn ich die Funktion direkt als *.c einfüge und nicht über LIB. Habe schon einiges probiert doch leider ohne Erfolg. @Peter, sorry aber ich denke dies sind unterschiedliche Probleme und diese alle in einem Thread zu besprechen macht das ganze etwas undurchsichtig. TOM
"sorry aber ich denke dies sind unterschiedliche Probleme" Du irrst ! Dein Problem ist immer noch das gleiche, Du hast nicht zugehört (gelesen), was in ein h-File gehört. Das da oben sind Speicherallocationen und Zuweisungen, die eben nicht reingehören sondern in nur eines der C-Files ! Das h-file muß mit "extern" und ohne Zuweisung sein:
1 | extern xdata int MS2001IuA0 [6][3]; |
2 | |
3 | extern unsigned char S2001IuA5_z, |
4 | MS2001IuA6_z, |
5 | MS2001IuA7_z, |
6 | MS2000R_z, |
7 | MS2000W1_z; |
Peter
Peter bestätigt meine Vermutungen. Ausführlicher: Was Du (Tom) da bislang machst, ist, daß Du in jedem Modul, das die Headerdatei einbindet, neue globale Variablen MS2001uA0 etc. anlegst. Somit sind diese mehrfach vorhanden, was zur von Dir beklagten Linkermeldung führt. Zwar kann man den gcc-linker dazu bewegen, solche mehrfach vorhandenen globalen Variablen gleichen Namens zusammenzufassen und so diesen Fehler zu kaschieren, das aber ist alles andere als standardkonformes Verhalten (und wird von daher von mir mit gerümpfter Nase* betrachtet). Also: In einer Headerdatei werden die von Dir verwendeten Variablen deklariert (mit dem Schlüsselwort "extern"), und in exakt einem C-Sourcefile werden die Variablen definiert_ und _initialisiert. Das sollte entweder das Sourcefile sein, das funktional am meisten mit diesen Variablen zu tun hat (so denn Dein Programm wenigstens so strukturiert geschrieben ist, daß ein solcher Zusammenhang zu erkennen ist) oder aber in einem eigenen Sourcefile, das Du vielleicht auch sinnvoll globals.c oder ähnlich benennen solltest. Die Headerdatei, in der diese Variablen deklariert und initialisiert werden, sollte der übersichtlichkeit halber denselben Namen wie das Sourcefile haben, in dem die Variablen definiert sind. *) Sinnvoll ist meiner Ansicht nach ein orthogonales Verhalten; warum Variablen anders behandeln als Funktionen? Funktionen gleichen Namens in mehreren Modulen lassen sich -wie wohl jeder erkennen dürfte- eh' nicht zusammenfassen. Also sollten solche Mauscheleien unterbleiben.
@ Peter und Rufus, Danke erst mal für Eure schnelle Hilfestellung zu meinem Problem. Ich möchte nun nochmal zusammenfassen ob ich alles verstanden habe. Ich deklariere in meinem C-Sourcefile die Variablen wie folgt: xdata int MS2001IuA0 [6][3]; xdata int S2001IuA [500][6]; unsigned char MS2001ID_z=0,MS2001IuA0_z=0,MS2001IuA1_z=0, MS2001IuA2_z=0,MS2001IuA3_z=0,MS2001IuA4_z=0; //Zeilenzähler für Zwischenspeicher Array unsigned char S2001IuA5_z=0,MS2001IuA6_z=0,MS2001IuA7_z=0, MS2000R_z=0,MS2000W1_z=0; Nun erstelle ich ein H-File mit dem gleichen Name wie das C-File und deklariere wie folgt: extern xdata int MS2001IuA0 [6][3]; extern xdata int S2001IuA [500][6]; extern unsigned char MS2001ID_z=0,MS2001IuA0_z=0,MS2001IuA1_z=0, MS2001IuA2_z=0,MS2001IuA3_z=0,MS2001IuA4_z=0; //Zeilenzähler für Zwischenspeicher Array extern unsigned char S2001IuA5_z=0,MS2001IuA6_z=0,MS2001IuA7_z=0, MS2000R_z=0,MS2000W1_z=0; Habe ich dies nun hoffentlich richtig verstanden!! Gruß TOM
Fast. Aber Du näherst Dich dem Ziel. In der Headerdatei musst Du die Initialisierungen weglassen, also nur extern xdata int MS2001IuA0 [6][3]; extern xdata int S2001IuA [500][6]; extern unsigned char MS2001ID_z, MS2001IuA0_z, MS2001IuA1_z, MS2001IuA2_z, MS2001IuA3_z, MS2001IuA4_z; etc. schreiben. Das hat Peter übrigens schon gestern abend so geschrieben.
@ Rufus&Peter, sorry, habe dieses Detail anscheinend in meiner Verzweiflung übersehen. Habe nun alles so geändert wie Ihr es geschrieben habt, habe nun auch den Zusammenhang zwischen C-Source,Funktionen und H-File begriffen war eben das erste Mal für mich. In anderesn H-Files ist es ja grnauso hätte mir eigentlich auffallen müssen doch vor lauten Bäumen habe ich anscheinend den Wald übersehen. Aus alle Fälle funktioniert nun mein Programm ohne zu maulen. DANKE nochmal für eure tatgräftige Unterstützung mich auf den richtigen Weg zu führen finde ich super von Euch. Nur noch eine vorläufig letzte Frage mit welchen Tool/Programm arbeitet Peter da immer das mit der Syntaxhervorhebung? Gruss TOM
Das ist eine Funktion des Forums. Text, der von "eckige-Klammer-auf C eckige-Klammer-zu" und "eckige-Klammer-auf / C eckige-Klammer-zu" umgeben ist, wird so dargestellt.
1 | also so zum Beispiel |
Klicktest Du auf das oberhalb des Abschnittes zu sehende '?', dann erhieltest Du auch eine entsprechende Hilfe.
... funktioniert wohl nicht immer
1 | // ich bin ein kommentar
|
2 | |
3 | /* ich bin auch einer */
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.