質問
私は、ヘッダーだけを使って、自分のコードを組織してきましたが、私はこれをやったのと同様に、私は、リンク時にエラーになっていることを警告しました。
私はこのようなものである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:〜/開発/テスト$ gccの-o test.o -c test.cの-Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs
機能には「メイン」:test.cの
test.cの:11:警告:関数の暗黙的な宣言「テスト」
Ubuntuの@のeeePC:〜/開発/テスト$
当時、それは単純な警告だが、私はそれをリンクしようとすると...
Ubuntuの@のeeePC:〜/開発/テスト$ LD -T linker.ld -o kernel.bin loader.o test.o
test.o:機能でmain':
Testing '
test.c:(.text+0xfc): undefined reference to
私がする必要があるか?
解決
の編集の私がいるにもかかわらず、私の答えのいくつかの行を三振しているOPの質問を反映してupvoted ...
<ストライキ> kernel.cは、あなたがそれをここで述べていないにも関わらず、コンパイラにアップフラグが立てられているのはなぜ?何かが欠けアムI ... ストライキ>
<ストライキ>gcc -o test.o -c test.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs kernel.c: In function ‘main’: kernel.c:11: warning: implicit declaration of function ‘Testing’ ubuntu@eeepc:~/Development/Test$ストライキ>
<ストライキ> ストライキ>
多分あなたは私はあなたがこの機能にアクセスするには、カーネルが欲しい判断だとして、それをあなたのヘッダファイルで、このようにどこかを行う必要があります
extern void Testing();
そして、すべての機能を取り出し、別の.cファイルに配置し、彼らは...最初の場所でそこにすべきではない例えばます:
Testing.c /* all your functions here */ Testing.h /* Only global, external variables and function prototypes */
希望このことができます、 宜しくお願いします、 トムます。
他のヒント
私はあなたの問題を再現することはできません。私はUbuntuマシン上でコードをコンパイルしようとすると、この作品が期待通りに(自分のペーストに基づいて、私はあなたが使用していると仮定します。)
あなたは確認する#includeが正しく何が起こっているされていますか?
コンパイラがどのように見えるをコンパイルしようとしているものを全部コードを参照するために-Eの代わりに-cを使用してみてください。
ややここに暗闇の中でショットの、私のCはビット錆びですが、Cは、ヘッダーに関数本体を置くことができないため?私はそれがないことを覚えていません。 .Cファイルにテスト()と印刷()の定義を移動してみてください?その修正は、それは、あなたが必要としない場合は/ Cをしたい場合にも見るように、C ++としてコンパイルしようとすることができます。
test.h
している間にあなたは、main.c
にtest1.h
が含まれています。名前に1
に注意します。
それに加えて、あなたはtest.c
をコンパイルすると、実際に自分のファイルの名前がtest.o
ありながら、test1.c
を結びます。ここでも、名前に1
に注意します。
の編集:の今、あなたはmain.c
に含まれるファイルの名前を編集しました。編集後は、あなたがの の記述の症状のほとんどは、ファイルの現在のバージョンでののpossbleではないことを主張するために安全です。再確認し、あなたが何をしているか、更新disgnostic情報を投稿および/または実際のコードを投稿します。
それでも、あなたのコンパイラとリンカのラインが古いファイル名を参照されます。
私はこれを引き起こしていただきました!をdonno、しかし、私はちょうど今、この問題を抱えていました。 .hファイルを削除した.cファイル自体の上に関数の宣言を入れてみてください。
は、この場合には、test1.hを削除してTest1.cにTest1.cにの関数の宣言を置きます。 そしてtest.cのでTest1.cに含ま あなたはこれ以上その警告メッセージ、また次のリンクエラーが出る文句を言いません。