2009-04-17 57 views
2

當我試圖建立我的項目中MPLAB,我得到這個編譯錯誤信息..Microchip的鏈接問題

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 

我已經檢查了路徑鏈接庫correct.I懷疑它是處理我的源代碼...任何幫助都非常感謝。

這裏是我的源代碼.. http://cl1p.net/mplabc18

+0

如果這是您的第一次嘗試,或者您習慣於看到事情的工作,這將有所幫助。而且,如果這個例子在破解之前正在工作。 – gbarry 2009-04-17 20:57:25

+0

您可以從c編譯器生成一個列表或asm文件嗎?或者查看鏈接器是否在地圖文件中生成了任何信息。 然後查看是否有任何主標籤。 – simon 2009-04-30 00:45:53

回答

0

我個人不具有源文件名與幾個空格,特別是嵌入式工具鏈緊張實施的角落!

但似乎他們正在做出合理的努力來添加所有的雙引號,所以也許這不是一個真正的問題。

實際上你的代碼中有一個'main'函數嗎?如果是這樣,它究竟是如何定義的?

0

我使用第三方編譯器,所以我無法提供任何特定的體驗。但我可能會懷疑的一件事是代碼中的某些內容導致編譯中途停止。這可能是一個未終結的評論,或者是一個缺少結尾大括號的函數。尤其要考慮#included文件,因爲在查看主文件時,無法在編輯器中看到效果,特別是檢查自己編寫的任何#includes。列表頂部是「你最後改變了什麼」?

我在這裏做的是做一個分支副本,並開始無情地攻擊巨大的代碼塊,以查看錯誤何時消失。分而治之。當然,這可能會很費時間,所以我可能會問StackOverflow,首先:)

0

這已經有一段時間了,但我看到你使用了一個編譯指示來定義中斷處理程序的位置,然後才創建函數,你可能需要用main()做同樣的事情嗎?

它可能在.h文件中處理 - 我不確定。我只在PIC上使用了ASM,並且我明確地處理了所有事情(例如,在0x000跳轉到main;在中斷向量地址跳轉到此內存地址;在主地址執行這些操作等)。 'main'對我來說被定義爲代碼段中的一個可用地址(我看到你已經完成了,開始了代碼段然後定義了main),但是我相信我必須明確定義'main'是從內存地址在代碼部分。同樣,它是ASM,但我不懷疑你需要做類似的事情 - 一個將main定義爲main的附註。

0

如果c018i.o包含復位向量,它是指名稱的功能爲主,那麼問題可能是主需要的原型 - 即使是在同一個文件中的函數本身,因此鏈接器可以選擇這個並將其放在其功能列表中。

所以,儘量插入:

void main (void); 

立即主要功能上面。

+0

沒有工作:( – kyw 2009-04-22 14:05:58

1

編譯器可能正在尋找main的不同定義。我曾經在一些PIC代碼看出這一點:

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

我試過it.still相同:( – kyw 2009-04-22 14:00:40

1

,在源文件中脫穎而出,我的唯一的事情就是ISR聲明的這一部分:

#pragma code InterruptVectorLow = 0x18

的您正在使用的編譯器的用戶指南狀態應該如下:

#pragma code low_vector=0x18

由於此聲明位於主函數之前,因此可能會給您帶來麻煩。

編輯:

所提出的解決方案似乎都不工作,所以我剛纔複製粘貼代碼到一個新的MPLAB項目,建立了PIC18F46K20設備。它用MCC18編譯器編譯得很好。該項目中唯一缺少的是「12 CCP PWM.h」頭文件(我沒有這個頭文件)。因此,無論您的頭文件有什麼問題,您的項目設置有問題,或者我正在使用MCC18 3.30而不是3.20這個事實都是問題所在。

+0

也沒有工作:( – kyw 2009-04-22 14:07:35

1

將特定的鏈接器文件添加到您的項目是一個好主意。如果您使用的是MPLAB,請在工作區下右鍵單擊鏈接程序文件,然後從mcc16 \ lkr文件夾爲特定處理器添加鏈接程序文件。 清潔和重新編譯解決方案

+0

我已經添加it.still相同.. – kyw 2009-04-22 13:59:15

1

代碼編譯爲我好(C18 3.30滿)

我有過MPLAB昏倒了,有點對我尤其是在大型的源代碼樹,多次重啓已經解決了這個問題,絕對不知道爲什麼,嘗試了其他一切,這是讓mplab重置的唯一方法。