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

特定のリンカー ファイルをプロジェクトに追加することをお勧めします。MPLAB を使用している場合は、ワークスペースの下でリンカー ファイルを右クリックし、特定のプロセッサの mcc16\lkr フォルダーからリンカー ファイルを追加します。ソリューションをクリーンアップして再コンパイルする

于 2009-04-20T18:56:25.040 に答える
1

コンパイラは、main の別の定義を探している可能性があります。私はいくつかのPICコードでこれを見てきました:

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

あなたのソース ファイルで私が唯一気になったのは、ISR 宣言の次の部分です。

#pragma code InterruptVectorLow = 0x18

使用しているコンパイラのユーザー ガイドには、次のように記載されています。

#pragma code low_vector=0x18

この宣言はメイン関数の直前にあるため、問題が発生する可能性があります。

編集:

提示された解決策はどれもうまくいかないようですので、PIC18F46K20 デバイス用にセットアップされた新しい MPLAB プロジェクトにあなたのコードをコピー アンド ペーストしました。MCC18 コンパイラで問題なくコンパイルできます。プロジェクトに欠けているのは、「12 CCP PWM.h」ヘッダー ファイルだけです (私は持っていません)。ヘッダー ファイルに問題があるか、プロジェクトのセットアップに問題があるか、または 3.20 ではなく MCC18 3.30 を使用していることが問題です。

于 2009-04-19T14:26:13.887 に答える
1

コードは問題なくコンパイルされます (C18 3.30 フル)

特に大規模なソース ツリーで MPLAB が少し不安定になりました。何度も再起動で解決しましたが、まったく理由がわかりませんでした。他のすべてを試してみましたが、それが mplab をリセットする唯一の方法でした。

于 2009-05-05T05:47:32.333 に答える
0

しばらく経ちましたが、関数を作成する前に、プラグマを使用して割り込みハンドラーの場所を定義しているのを見ました。main()で同じことを行う必要があるでしょうか。

.hファイルで処理される可能性があります-よくわかりません。私はこれまでPICでASMのみを使用し、すべてを明示的に処理しました(つまり、0x000でメインにジャンプ、割り込みベクトルアドレスでこのメモリアドレスにジャンプ、メインアドレスでこれらのことを実行するなど)。私にとっての「main」は、コードセクションで使用可能なアドレスとして定義されました(これは、コードセクションを開始してから、mainを定義しました)が、「main」は、コードセクションのメモリアドレス。繰り返しになりますが、それはASMでしたが、同様のことを行う必要があることは間違いありません。mainをmainとして定義するためのプラグマです。

于 2009-04-17T17:45:02.053 に答える
0

個人的には、特に組み込みのツールチェーンを使用して、いくつかのスペースを含むソースファイル名を使用することで、実装の隅々に負担をかけることはありません。

しかし、彼らはすべての二重引用符を追加するために合理的な努力をしているように思われるので、おそらくそれは実際の問題ではありません。

あなたは実際にあなたのコードに'main'関数を持っていますか?もしそうなら、それは正確にどのように定義されていますか?

于 2009-04-17T16:18:53.697 に答える
0

c018i.o にリセット ベクトルが含まれていて、それが名前で関数 main を参照している場合、関数自体と同じファイルであっても main にプロトタイプが必要である可能性があるため、リンカーはこれを取得して main を配置できます。関数のリストにあります。

だから、挿入してみてください:

void main (void);

main 関数のすぐ上。

于 2009-04-17T23:05:41.253 に答える
0

私はサードパーティのコンパイラを使用しているため、それに関する特定の経験を提供することはできません. しかし、私が疑うかもしれないことの 1 つは、コード内の何かがコンパイルを途中で停止させているということです。これは、終了していないコメント、または右中括弧が欠落している関数である可能性があります。特に #include ファイルを検討してください。なぜなら、メイン ファイルを見たときにエディターで効果を確認できないためです。特に、自分で作成した #includes を確認してください。リストの一番上にあるのは、「最後に何を変更しましたか?」

この時点で私がしていることは、ブランチのコピーを作成し、容赦なくコードの巨大なブロックをハッキングし始め、エラーがいつ解消されるかを確認することです。分割統治。もちろん、これには時間がかかる可能性があるため、最初に StackOverflow について質問することをお勧めします :)

于 2009-04-17T16:34:17.280 に答える