0

わかりましたので、クラスの 1 つの最終プロジェクトを行っており、少し余分に作業して複数のファイルを作成しようとしています。CodeBlocks 内でコーディングしています。これまでのところ、私のファイルには main.c、levels.c、levels.h があります。コーディングを進める前に、level.c の levelOne 関数内に printf ステートメントをテストとして配置し、2 つのファイルが相互に機能することを確認しました。プログラムをコンパイルして実行すると、「'levelOne' への未定義の参照が発生しました。

私のmain.cファイル内:

#include <stdio.h>
#include <stdlib.h>
#include "levels.h"

int main()
{
levelOne();
return 0;
}

私のlevels.hファイル内:

#ifndef LEVELS_H_INCLUDED
#define LEVELS_H_INCLUDED

void levelSelect(char c); 
void levelOne();
void levelTwo();
void levelThree();
void levelCustom(int difficulty);

#endif // LEVELS_H_INCLUDED

私のlevels.cファイル内:

void levelOne()
{
//level scope of 1 to 10
srand(time(NULL));
int randomNum = (rand() % 9)+1);
printf("the random number is: %i\n", randomNum);
}
4

4 に答える 4

0

levels.cがコンパイラに渡されていませんlevels.c。プロジェクト全体に含めてよろしいですか? そうしないとリンクしません。複数のファイルをコンパイルする場合は、プロジェクトが必要です。CodeBlocks では、ビルド プロセスのソースと設定がプロジェクト ファイルに保存されます。<name>.cbp

ユーザーマニュアルはこちら

于 2013-11-08T05:30:58.123 に答える
0

gcc levels.c main.c が正常にリンクされるはずです。gcc main.c は 1 つのファイルのみをコンパイルし、リンクを試行して最終的な実行可能ファイルを作成しますが、levelOne() は見つかりません。ファイルlevels.cにあるため

于 2013-11-08T05:31:44.407 に答える
0

levelOne よりも上の関数が (物理的に) それを呼び出した場合、level.h も level.c に含める必要があります。それは未定義です。

次にgcc -Wall *.c -o myapp、(ほぼ) すべての警告を有効にして、そのディレクトリ内のすべての c ファイルをコンパイルして myapp (または個別に名前を付けることができます) にリンクします。これは、独自のディレクトリにある場合に限ります。

より多くのコードを含む大規模なプロジェクトに入ると、個々の .c ファイルを .o オブジェクト ファイルにコンパイルしgcc -Wall -c somecode.c、すべてのオブジェクトを でリンクできますgcc *.o -o myapp。それが非常に大きくなると、そのコード (または依存コード) が変更されたとき (Makefile、waf、あえて言うなら autotools など) にのみオブジェクトの再構築を支援するビルド システムが必要になります。

于 2013-11-08T05:36:22.853 に答える