2009-04-17 8 views
2

, wenn ich versuche, mein Projekt in MPLAB zu bauen, ich habe diese Build-Fehlermeldung ..Microchip Linkers Problem

Clean: Deleting intermediary and output files. 
Clean: Deleted file "M:\12 CCP PWM\12 CCP PWM.o". 
Clean: Done. 
Executing: "C:\MCC18\bin\mcc18.exe" -p=18F46K20 "12 CCP PWM.c" -fo="12 CCP PWM.o" -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa- 
MPLAB C18 v3.20 (feature limited) 
Copyright 1999-2005 Microchip Technology Inc. 
This version of MPLAB C18 does not support the extended mode 
and will not perform all optimizations. To purchase a full 
copy of MPLAB C18, please contact your local distributor or 
visit buy.microchip.com. 

Executing: "C:\MCC18\bin\mplink.exe" /l"C:\MCC18\lib" "C:\MCC18\lkr\18f46k20i.lkr" "12 CCP PWM.o" /u_CRUNTIME /o"12 CCP PWM.cof" /M"12 CCP PWM.map" /W 
MPLINK 4.20, Linker 
Copyright (c) 2008 Microchip Technology Inc. 
Error - could not find definition of symbol 'main' in file 'C:\MCC18\lib/c018i.o'. 
Errors : 1 

Link step failed. 
---------------------------------------------------------------------- 
Release build of project `M:\12 CCP PWM\12 CCP PWM.mcp' failed. 
Thu Apr 16 14:34:41 2009 
---------------------------------------------------------------------- 
BUILD FAILED 

ich überprüft habe, dass der Pfad an die Linker-Bibliothek wurde correct.I vermuten, es hat etwas mit meinem Quellcode zu tun ... Jede Hilfe wird sehr geschätzt.

Hier ist meine Quellcode .. http://cl1p.net/mplabc18

+0

Es wäre hilfreich zu erwähnen, wenn dies Ihr erster Versuch ist, oder wenn Sie daran gewöhnt sind, Dinge zu sehen, die funktionieren. Und wenn dieses Beispiel funktionierte, bevor es kaputt ging. – gbarry

+0

Können Sie vom c-Compiler eine Liste oder eine asm-Datei erzeugen? oder prüfen Sie, ob der Linker Informationen in der Map-Datei generiert hat. Dann schauen Sie, ob es ein Haupt: Label irgendwo gibt. – simon

Antwort

0

persönlich durch in Ich würde die Ecken der Umsetzung nicht belasten mit mehreren Räumen Source-Dateinamen, besonders mit einem eingebetteten Werkzeugkette!

Aber es scheint, dass sie sich bemühen, alle doppelten Anführungszeichen hinzuzufügen, also ist das vielleicht kein echtes Problem.

Haben Sie tatsächlich eine "Haupt" -Funktion in Ihrem Code, und wenn ja, wie genau ist es definiert?

0

Ich verwende einen Compiler von Drittanbietern, daher kann ich dazu keine spezifische Erfahrung anbieten. Aber eine Sache, die ich vermuten könnte, ist, dass etwas im Code dafür sorgt, dass die Kompilierung auf halbem Wege aufhört. Dies kann ein nicht abgeschlossener Kommentar oder eine Funktion mit einer fehlenden geschweiften Klammer sein. Betrachten Sie insbesondere die #included-Dateien, da Sie die Effekte in Ihrem Editor nicht sehen können, wenn Sie sich die Hauptdatei anschauen, und insbesondere prüfen, ob #includes Sie selbst geschrieben haben. Und ganz oben auf der Liste steht: "Was hast du zuletzt geändert?"

Was ich an diesem Punkt mache, ist eine Zweigkopie zu machen und gnadenlos damit zu beginnen, riesige Codeblöcke zu hacken, nur um zu sehen, wann der Fehler verschwindet. Teilen und erobern. Natürlich kann dies zeitaufwendig sein, also würde ich wahrscheinlich zuerst auf StackOverflow fragen :)

0

Es ist eine Weile her, aber ich sah, dass Sie ein Pragma verwendet haben, um den Speicherort des Interrupt-Handlers zu definieren, bevor Sie den erstellten Funktion, müssen Sie vielleicht dasselbe mit main() tun?

Es könnte in der .h-Datei behandelt werden - ich bin mir nicht sicher. Ich habe immer nur ASM auf den PICs verwendet und ich habe explizit alles gehandhabt (zB bei 0x000 springe zu main; bei der Interrupt-Vektoradresse springe auf diese Speicheradresse; bei Hauptadresse mache diese Dinge, usw.). 'main' für mich wurde definiert als eine verfügbare Adresse in der Code-Sektion (was ich gesehen habe, habe ich den Code-Abschnitt gestartet und dann main definiert), aber ich glaube, ich musste explizit definieren, dass 'main' bei a beginnen sollte Speicheradresse im Codeabschnitt. Wiederum war es ASM, aber ich würde nicht bezweifeln, dass Sie etwas Ähnliches tun müssen - ein Pragma, um main als Haupt zu definieren.

0

Wenn c018i.o den reset-Vektor enthält und sich auf die Funktion main by name bezieht, dann könnte das Problem sein, dass main einen Prototyp benötigt - sogar in der gleichen Datei wie die Funktion selbst, also kann der Linker dies auswählen up und put main in seiner Liste von Funktionen.

Also, versuchen Sie Einfügen:

void main (void); 

unmittelbar über der Hauptfunktion.

+0

hat auch nicht funktioniert :( – kyw

1

Der Compiler sucht möglicherweise nach einer anderen Definition von main.Ich habe dies in einigen PIC-Code gesehen:

// Main application entry point. 
#ifdef __C30__ 
int main(void) 
#else 
void main(void) 
#endif 
{ ... } 
+0

ich habe es versucht.noch das gleiche :( – kyw

1

Das einzige, was in der Quelldatei mir auffiel ist dieser Teil der ISR-Deklaration:

#pragma code InterruptVectorLow = 0x18

Die Benutzerhandbuch des Compilers, den Sie verwenden, besagt das sollte sein:

#pragma code low_vector=0x18

Da diese Deklaration kurz vor der Hauptfunktion steht, kann es zu Problemen führen.

Edit:

Keine der vorgestellten Lösungen scheinen so zu arbeiten, ich habe gerade Ihren Code in eine neue MPLAB Projekt-Kopie eingefügt, für die PIC18F46K20 Gerät einrichten. Es kompiliert gut mit dem MCC18-Compiler. Das einzige, was im Projekt fehlt, ist die Header-Datei "12 CCP PWM.h" (die ich nicht habe). Entweder stimmt etwas mit der Header-Datei nicht, etwas stimmt nicht mit dem Projekt-Setup oder die Tatsache, dass ich MCC18 3.30 anstelle von 3.20 verwende, ist das Problem.

+0

hat nicht funktioniert entweder :( – kyw

1

Es ist eine gute Idee, die spezifische Linkerdatei zu Ihrem Projekt hinzuzufügen. Wenn Sie MPLAB verwenden, klicken Sie im Arbeitsbereich mit der rechten Maustaste auf Linker-Dateien und fügen Sie die Linker-Datei aus dem Ordner mcc16 \ lkr für den jeweiligen Prozessor hinzu. reinigen und neu kompilieren, die Lösung

+0

Ich habe es hinzugefügt.noch das gleiche .. – kyw

1

Code für mich in Ordnung kompiliert (C18 3.30 voll)

i MPLAB auf mich ein bisschen habe einpennen besonders auf großen Quelle Bäume, oft ein Neustart hat es gelöst , absolut keine Ahnung warum, versuchte alles andere und es war der einzige Weg, um Mplab zurückzusetzen.

+0

+1 Das manchmal MPLAB nur verwirrt und muss neu gestartet werden. –