2

当我尝试在 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

4

8 回答 8

1

The compiler may be looking for a different definition of main. I have seen this in some PIC code:

// Main application entry point.
#ifdef __C30__
int main(void)
#else
void main(void)
#endif
{ ... }
于 2009-04-18T16:57:50.943 回答
1

将特定的链接器文件添加到您的项目中是个好主意。如果您正在使用 MPLAB,在工作区下,右键单击链接器文件并从 mcc16\lkr 文件夹中为特定处理器添加链接器文件。清理并重新编译解决方案

于 2009-04-20T18:56:25.040 回答
1

在您的源文件中,唯一让我印象深刻的是 ISR 声明的这一部分:

#pragma code InterruptVectorLow = 0x18

您正在使用的编译器的用户指南指出这应该是:

#pragma code low_vector=0x18

由于此声明就在您的主要功能之前,它可能会给您带来麻烦。

编辑:

所提供的解决方案似乎都不起作用,所以我刚刚将您的代码复制粘贴到一个新的 MPLAB 项目中,为 PIC18F46K20 器件设置。它使用 MCC18 编译器编译得很好。项目中唯一缺少的是“12 CCP PWM.h”头文件(我没有)。所以要么你的头文件有问题,要么你的项目设置有问题,或者我使用 MCC18 3.30 而不是 3.20 是问题所在。

于 2009-04-19T14:26:13.887 回答
1

代码对我来说编译得很好(C18 3.30 full)

我的 MPLAB 有点脱落,尤其是在大型源代码树上,很多次重启都解决了,完全不知道为什么,尝试了其他所有方法,这是让 mplab 重置的唯一方法。

于 2009-05-05T05:47:32.333 回答
0

我使用第三方编译器,所以我不能提供任何具体的经验。但我可能怀疑的一件事是代码中的某些内容导致编译中途停止。这可以是未终止的注释,也可以是缺少右大括号的函数。尤其要考虑#included 文件,因为当您查看主文件时,您无法在编辑器中看到效果,尤其要检查您自己编写的任何#includes。最重要的是,“你最后改变了什么”?

我现在要做的是制作一个分支副本,然后开始无情地破解大量代码,看看错误何时消失。分而治之。当然,这可能很耗时,所以我可能会先询问 StackOverflow :)

于 2009-04-17T16:34:17.280 回答
0

已经有一段时间了,但是我看到您在创建函数之前使用了一个编译指示来定义中断处理程序的位置,您是否需要对 main() 做同样的事情?

它可能在 .h 文件中处理 - 我不确定。我只在 PIC 上使用过 ASM,并且我明确地处理了所有事情(即,在 0x000 处跳转到 main;在中断向量地址处跳转到该内存地址;在 main 地址处执行这些操作,等等)。'main' 对我来说被定义为代码部分中的可用地址(我看到你已经完成了,开始代码部分然后定义 main)但我相信我必须明确定义'main' 是从一个代码段中的内存地址。同样,它是 ASM,但我不怀疑您需要做类似的事情 - 将 main 定义为 main 的 pragma。

于 2009-04-17T17:45:02.053 回答
0

如果 c018i.o 包含重置向量,并且它通过名称引用函数 main,那么问题可能是 main 需要一个原型 - 即使在与函数本身相同的文件中,所以链接器可以选择它并将 main在其功能列表中。

所以,尝试插入:

void main (void);

在 main 函数的正上方。

于 2009-04-17T23:05:41.253 回答
0

就我个人而言,我不会因为源文件名中有几个空格而使实现的角落变得紧张,尤其是使用嵌入式工具链!

但似乎他们正在做出合理的努力来添加所有双引号,所以也许这不是一个真正的问题。

您的代码中是否真的有一个“主”函数,如果有,它是如何定义的?

于 2009-04-17T16:18:53.697 回答