从没有自定义头文件的多个C文件调用方法,Makefile链接

时间:2012-10-25 18:47:18

标签: c methods compilation prototype

这在翻译中有点丢失,所以我会更精确: 我们有类recursion.c,fib.c和countUp.c。从recursion.c我们必须递归调用fib.c或countUp.c,由输入参数决定。我不能使用头文件,只是我必须放置原型:

int fib(int n);

void countUp(int n);

我的Makefile

TAR = tar
COMPILER_FLAGS = -g -Wall -std=c99 -c
LINKER_FLAGS = -g -o
OBJS = recurse.o
C_FILES = recurse.c fib.c countUp.c
ASM_FILES = recurse.asm
TARGET_FILE = recurse
TARGET_TAR = PA5.tar

$(TARGET_TAR): $(TARGET_FILE)
    $(TAR) -cvf $(TARGET_TAR) $(C_FILES) $(ASM_FILES) $(TARGET_FILE) Makefi$

recurse.o: recurse.c
    $(C_COMPILER) $(COMPILER_FLAGS) $(C_FILES)

$(TARGET_FILE): $(OBJS)
    $(LD_LINKER) $(LINKER_FLAGS) $(TARGET_FILE) $(OBJS)

必须递归调用fib和countUp类方法。 recursive.c文件被认为是我们的c驱动程序。不要创建或实现任何头文件,而不是标准c头文件(stdio.h,string.h等)。当我尝试运行时,我得到:

make
gcc -g -o recurse recurse.o
recurse.o: In function `main':
(file root location)/recurse.c:43: undefined reference to `fib'
(file root location)/recurse.c:46: undefined reference to `countUp'
collect2: ld returned 1 exit status
make: *** [recurse] Error 1

任何线索是什么。

原始问题: 我有多个C文件,我正在组合成一个可执行文件。比如说我有math.c,参数传递给它,然后如果输入参数调用add它执行add.c中的函数,如果参数调用减去它将从subtract.c调用函数等。文件然后编译成.o文件,然后创建可执行文件。我遇到的问题是无法使用标题(.h)文件。有没有办法打破单独的类或我错过了什么?我真的不知道如何问这个问题,就C来说,行话很糟糕,对不起:(

我猜我真的不知道司机的想法。 (不是设备驱动程序,她一直告诉我们这是一个可执行的驱动程序)。

3 个答案:

答案 0 :(得分:2)

如果我理解正确,我认为你需要做的是在recursion.c中定义的任何函数之上添加以下原型。原型允许您从recursion.c内的任何函数内调用这些函数(事实上,包括头文件类似于复制粘贴文件中定义的所有原型,因为@Justin和@EdS已经指向出)

int fib(int n);
void countUp(int n);

int main() {
 ...
}

然后你需要确保你的项目文件包含文件recursion.c,fib.c和countUp.c - 当你构建你的项目时,链接器将完成它的工作和查找编译目标文件中的入口点,并将继续汇编单个可执行文件。

您使用的是哪种编译器?

答案 1 :(得分:1)

包含头文件只是一个预处理器指令,用于在include的位置包含该文件的内容。要在没有头文件的情况下实现相同的功能,只需将您在头文件中放入的代码复制并粘贴到每个c文件的顶部。

当然这不是很容易维护,好像你想要更改你需要在许多文件中更改它的内容,因此首先存在头文件的原因。

答案 2 :(得分:0)

由于这是家庭作业,并考虑到你告诉我们A)你没有头文件可以使用,而且B)你没有被指示使用extern关键字这一事实,在我看来,您唯一的选择是自己包含.c文件:

#include "add.c"
#include "subtract.c"
/* etc... */

int main()
{
    // use functions defined in "add.c", "subtract.c", etc.
}

请注意,这是一个糟糕的形式,因为您包含实现而不是接口,并且可能会引入一堆您不想要或不需要的东西。如果这不能回答你的问题,那么你的老师会有一些问题,但问题中缺少这些教训。