如何正确链接两个源文件?未定义的引用错误

时间:2013-11-08 05:28:45

标签: c codeblocks

好的,我正在为我的一个类做一个最终项目,并试图做一些额外的工作并创建多个文件。我在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 个答案:

答案 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:文件无法识别:文件格式无法识别..”错误。