好的,我正在为我的一个类做一个最终项目,并试图做一些额外的工作并创建多个文件。我在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);
}
答案 0 :(得分:0)
levels.c
未被传递到编译器中,您确定已在整个项目中包含levels.c
吗?如果没有,它将不会链接。如果要编译多个文件,则需要一个项目。在CodeBlocks中,构建过程的源和设置存储在项目文件<name>.cbp
以下是User Manual
答案 1 :(得分:0)
gcc levels.c main.c应该成功链接。 gcc main.c只会编译一个文件并尝试链接以创建最终的可执行文件,并且找不到levelOne()。因为它在文件级别。
答案 2 :(得分:0)
你还需要在levels.c中包含levels.h,或者如果一个函数(物理上)在levelOne之上调用它,它是未定义的。
然后使用gcc -Wall *.c -o myapp
编译它以编译并将该目录中的所有c文件链接到myapp(或者您可以单独命名),并启用(几乎)所有警告。如果您将其放在自己的目录中,则可以使用此功能。
使用更多代码进入更大的项目后,可以使用gcc -Wall -c somecode.c
将单个.c文件编译为.o目标文件,然后使用gcc *.o -o myapp
链接所有对象。如果它变得非常大,你将需要一个构建系统来帮助重建对象只有当它的代码(或依赖代码)发生变化时(例如Makefile,waf,并且我敢说自动工具)。
答案 3 :(得分:-2)
我有同样的问题,解决方案很简单。右键单击levels.c并选择属性。应该出现一个属性窗口,选择“Build”选项卡勾选编译文件,链接文件,并在框中检查调试和发布。这应该可以解决您的问题。
不要错误地使用头文件执行此操作,因为它会为您提供“... h.gch:文件无法识别:文件格式无法识别..”错误。