2009-04-17 4 views
2

, когда я пытался построить мой проект в MPLAB, я получил сообщение об ошибке сборки ..Microchip Linker проблема

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

+0

Можете ли вы создать список или файл asm из компилятора c? или посмотреть, может ли компоновщик сгенерировать любую информацию в файле карты. Тогда посмотрите, есть ли главная: ярлык в любом месте. – simon

ответ

0

Лично я бы не напрягаться углами реализации, имея имена исходных файлов с несколькими пробелами в, в частности, с помощью встроенного набора инструментов!

Но похоже, что они прилагают разумные усилия, чтобы добавить все двойные кавычки, так что, возможно, это не настоящая проблема.

У вас на самом деле есть «главная» функция в вашем коде, и если да, то точно как она определена?

0

Я использую сторонний компилятор, поэтому я не могу предложить какой-либо конкретный опыт. Но одна вещь, которую я могу заподозрить, заключается в том, что что-то в коде вызывает остановку компиляции. Это может быть незавершенный комментарий или отсутствующая функция с закрывающей скобкой. Рассмотрим, в частности, #included файлы, потому что вы не можете видеть эффекты в своем редакторе при просмотре основного файла и, в частности, проверить все #includes, которые вы написали сами. И в верхней части списка, «что вы изменили последним»?

То, что я делаю в этот момент, это сделать копию ветки и начать беспощадно взламывать огромные блоки кода, просто чтобы увидеть, когда ошибка исчезнет. Разделите и победите. Конечно, это может занять много времени, поэтому я, вероятно, сначала спрошу о StackOverflow :)

0

Прошло некоторое время, но я увидел, что вы использовали прагму для определения местоположения обработчика прерываний, прежде чем создавать функции, возможно, вам нужно сделать то же самое с main()?

Возможно, это обработано в файле .h. Я не уверен. Я только когда-либо использовал ASM для PIC, и я явно обрабатывал все (т. Е. При 0x000 прыгать на главную, на адрес вектора прерывания переходить на этот адрес памяти, на основном адресе - на эти вещи и т. Д.). «main» для меня был определен как доступный адрес в разделе кода (который, как я вижу, вы сделали, запустил раздел кода, а затем определил основной), но я считаю, что я должен был четко определить, что «главная» должна была начинаться с адрес памяти в разделе кода. Опять же, это был ASM, но я бы не сомневался, что вам нужно сделать что-то подобное - прагму, чтобы определить главную как главную.

0

Если c018i.o содержит вектор сброса, и он ссылается на функцию main по имени, тогда проблема может заключаться в том, что основной нужен прототип - даже в том же файле, что и сама функция, поэтому компоновщик может выбрать этот и включите main в свой список функций.

Итак, попробуйте вставить:

void main (void); 

непосредственно над основной функцией.

+0

тоже не работал :( – kyw

1

Компилятор может искать другое определение main.Я видел это в какой-то ПОС код:

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

Я пробовал его. Осталось то же самое :( – kyw

1

Единственное, что стоял ко мне в исходном файле эта часть декларации ISR:

#pragma code InterruptVectorLow = 0x18

руководство пользователя используемого вами компилятора должно быть:

#pragma code low_vector=0x18

Поскольку это заявление находится непосредственно перед вашей основной функцией, это может дать вам проблемы.

Edit:

Ни один из представленных решений не похоже на работу, так что я просто скопировать вставить код в новый проект MPLAB, установите для устройства PIC18F46K20. Он компилируется с помощью компилятора MCC18. Единственное, чего не хватает в проекте, это заголовочный файл «12 CCP PWM.h» (которого у меня нет). Таким образом, что-то не так с вашим заголовочным файлом, что-то не так с вашей настройкой проекта, или тот факт, что я использую MCC18 3.30 вместо 3.20, является проблемой.

+0

тоже не работал :( – kyw

1

Рекомендуется добавить конкретный файл компоновщика в ваш проект. Если вы используете MPLAB, в рабочей области щелкните правой кнопкой мыши на файлах-линкерах и добавьте файл-компоновщик из папки mcc16 \ lkr для конкретного процессора. Чистота и пересобрать решение

+0

Я добавил его. То же самое. – kyw

1

код компилируется нормально для меня (С18 3,30 полный)

Я имел MPLAB валиться немного на меня, особенно на больших деревьев исходников, много раз перезагрузка решил его , совершенно не знаю, почему, попробовал все остальное, и это был единственный способ получить mplab для сброса.

+0

+1 Что иногда MPLAB просто путается и ему нужно перезапустить. –