0

好的,所以我正在为我的一个课程做一个最终项目,并尝试做一些额外的工作并创建多个文件来使用。我在 CodeBlocks 内编码。到目前为止,我的文件有 main.c、levels.c 和 levels.h。在 levels.c levelOne 函数中,我将 printf 语句作为测试,以确保在继续编码之前我可以让这两个文件相互配合。当我编译和运行程序时,我得到了一个“对‘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 只会编译一个文件并尝试链接以创建最终的可执行文件,并且找不到 levelOne()。因为它在文件levels.c中

于 2013-11-08T05:31:44.407 回答
0

您还需要在levels.c 中包含levels.h,或者如果levelOne 之上的函数(物理上)调用它,它是未定义的。

然后编译它gcc -Wall *.c -o myapp以编译并将该目录中的所有 c 文件链接到 myapp (或者您可以单独命名它们),并启用(几乎)所有警告。前提是您将其放在自己的目录中。

一旦您进入具有更多代码的大型项目,您可以将单个 .c 文件编译为 .o 目标文件,gcc -Wall -c somecode.c然后使用 .o 链接所有对象gcc *.o -o myapp。如果它变得非常大,您将需要一个构建系统来帮助仅在其代码(或相关代码)更改时(例如 Makefiles、waf 和我敢说 autotools)来帮助重建对象。

于 2013-11-08T05:36:22.853 回答
-2

我有这个完全相同的问题,解决方案很简单。右键单击levels.c 并选择属性。应该会出现一个属性窗口,选择“构建”选项卡勾选编译文件、链接文件,并在框中选中调试和发布。这应该可以解决您的问题。

不要错误地使用头文件执行此操作,因为它会给您“...h.gch:文件无法识别:文件格式无法识别..”错误。

于 2015-02-21T03:32:48.633 回答