这在翻译中有点丢失,所以我会更精确: 我们有类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来说,行话很糟糕,对不起:(
我猜我真的不知道司机的想法。 (不是设备驱动程序,她一直告诉我们这是一个可执行的驱动程序)。
答案 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.
}
请注意,这是一个糟糕的形式,因为您包含实现而不是接口,并且可能会引入一堆您不想要或不需要的东西。如果这不能回答你的问题,那么你的老师会有一些问题,但问题中缺少这些教训。