-1

ヘッダーを使用してコードを整理しただけですが、これを行ったのと同じように、リンク時にエラーになるという警告が表示されました。

次のようなコード(ヘッダー内にある関数の使用)がありますtest.c

#include "test1.h"

/* Some code */
main()
{
   Testing();
}

そして私のtest1.hヘッダーは次のようなものです:

void Testing();
void print(int, int, int, const char*);

そしてtest1.c

void Testing()
{
   print(0xF9, 27, 5, "\xC9\\xBB");
}

void print(int colour, int x, int y, const char *string)
{
   volatile char *video=(volatile char*)0xB8000 + y*160 + x*2;
   while(*string != 0)
   {
      *video=*string;
      string++;
      video++;
      *video=colour;
      video++;
   }
}

コードをコンパイルしようとすると、次のようになりました。

ubuntu@eeepc:~/Development/Test$ gcc -o test.o -c test.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs
test.c: 関数 'main' 内:
test.c:11: 警告: 暗黙的関数 'Testing' の宣言<br> ubuntu@eeepc:~/Development/Test$

当時は単なる警告ですが、リンクしようとすると...

ubuntu@eeepc:~/Development/Test$ ld -T linker.ld -o kernel.bin loader.o test.o
test.o: In function Testing'main':
test.c:(.text+0xfc): undefined reference to

私は何をする必要がありますか?

4

5 に答える 5

1

私はあなたの問題を再現することはできません。これは、Ubuntuマシンでコードをコンパイルしようとすると、期待どおりに機能します(これは、貼り付けに基づいており、使用していると思います)。

#includeが正しく行われていることを確認しますか?

-cの代わりに-Eを使用して、コンパイラがコンパイルしようとしているコード全体がどのようになるかを確認してください。

于 2010-01-27T02:13:32.273 に答える
1

編集: OPの質問を反映するために、賛成票を投じられたにもかかわらず、回答のいくつかの行を打ち消しました...

ここで言及されていないにもかかわらず、kernel.c がコンパイラでフラグが立てられるのはなぜですか? 何か足りないのでしょうか...

gcc -o test.o -c test.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs
kernel.c: 関数 'main' 内:
kernel.c:11: 警告: 関数 'Testing' の暗黙的な宣言
ubuntu@eeepc:~/Development/Test$

カーネルにこの関数にアクセスさせたいと判断しているので、ヘッダーファイルのどこかでこのようにする必要があるかもしれません:

extern void テスト();

そして、すべての関数を取り出して別の .c ファイルに配置します。そもそもそこにあるべきではありません...例:

Testing.c
/* すべての関数がここにあります */

Testing.h
/* グローバル変数、外部変数、および関数プロトタイプのみ */

これがお役に立てば幸いです。よろしくお願いします、トム。

于 2010-01-27T02:04:31.840 に答える
0

あなたはに含まtest.hれてmain.cいますが、あなたの宣言は、あなたが書いたものによれば、にありますtest1.h。名前に注意してください1

それに加えて、コンパイルtest.cとリンクを行っていますがtest.o、実際にはファイルの名前はですtest1.c。繰り返し1ますが、名前のに注意してください。

編集:ここで、に含まれているファイルの名前を編集しましたmain.c。編集後、あなたが説明する症状のほとんどは、ファイルの現在のバージョンでは起こり得ないと断言するのは安全です。行っていることを再確認し、更新された診断情報を投稿したり、実際のコードを投稿したりします。

それでも、コンパイラとリンカの行は古いファイル名を参照しています。

于 2010-01-27T02:12:47.433 に答える
0

私はこれを引き起こしているものはありませんが、私はちょうど今この問題を抱えていました. .h ファイルを削除して、関数の宣言を .c ファイル自体の上に置いてみてください。

この場合、test1.h を削除し、test1.c の関数の宣言を test1.c に入れます。そして、test1.c を test.c に含めると、その警告メッセージが表示されなくなり、次のリンク エラーも表示されなくなります。

于 2010-05-26T14:21:09.423 に答える
0

私の C は少し錆びているので、ここではやや暗いショットですが、C では関数本体をヘッダーに入れることができますか? 私はそれがあったことを思い出しません。Testing() と print() の定義を .c ファイルに移動してみませんか? C を必要としない/したくない場合は、C++ としてコンパイルして、それが修正されるかどうかを確認することもできます。

于 2010-01-27T02:04:06.053 に答える