0

这在翻译中有点丢失,所以我要更准确地说:我们有类 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 它将调用 subtract.c 中的函数等。文件然后编译成 .o 文件,然后创建一个可执行文件。我遇到的问题是无法使用标头 (.h) 文件。有什么办法可以闯入单独的班级还是我错过了什么?我真的不知道如何问这个问题,就 C 而言,行话很糟糕,对不起:(

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

4

3 回答 3

2

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

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

int main() {
 ...
}

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

你用的是什么编译器?

于 2012-10-25T19:24:23.550 回答
1

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

当然,这不是很容易维护,就好像您想更改需要在许多文件中更改它的内容一样,因此为什么头文件首先存在。

于 2012-10-25T18:56:11.933 回答
0

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

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

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

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

于 2012-10-25T18:54:59.433 回答