Проблема с микрочип-линкером - PullRequest
2 голосов
/ 17 апреля 2009

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

    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

Я проверил, что путь к библиотеке компоновщика был правильным. Я подозреваю, что это как-то связано с моим исходным кодом ... Любая помощь очень ценится.

Вот мой исходный код .. http://cl1p.net/mplabc18

Ответы [ 8 ]

1 голос
/ 05 мая 2009

код компилируется нормально для меня (C18 3.30 заполнено)

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

1 голос
/ 19 апреля 2009

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

#pragma code InterruptVectorLow = 0x18

Руководство пользователя используемого вами компилятора гласит:

#pragma code low_vector=0x18

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

Edit:

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

1 голос
/ 20 апреля 2009

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

1 голос
/ 18 апреля 2009

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

// Main application entry point.
#ifdef __C30__
int main(void)
#else
void main(void)
#endif
{ ... }
0 голосов
/ 18 апреля 2009

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

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

void main (void);

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

0 голосов
/ 17 апреля 2009

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

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

0 голосов
/ 17 апреля 2009

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

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

0 голосов
/ 17 апреля 2009

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

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

Есть ли в вашем коде функция main, и если да, то как именно она определена?

...