C makefile未定义引用错误

C makefile未定义引用错误,c,makefile,undefined-reference,C,Makefile,Undefined Reference,我在C语言中使用makefile时遇到了一些小问题。我一直在遵循教科书中的教程,但它似乎不起作用。我有三个文件,message_hider.c、encrypt.h和encrypt.c。当我为这些文件创建一个makefile时,它会返回一个错误,但是当我单独运行每个命令时,它工作得很好。这是我的档案 加密.c #include "encrypt.h" void encrypt(char *message) { char c; while (*message) { *message = *mess

我在C语言中使用makefile时遇到了一些小问题。我一直在遵循教科书中的教程,但它似乎不起作用。我有三个文件,message_hider.c、encrypt.h和encrypt.c。当我为这些文件创建一个makefile时,它会返回一个错误,但是当我单独运行每个命令时,它工作得很好。这是我的档案

加密.c

#include "encrypt.h"

void encrypt(char *message) {
char c;
while (*message) {
*message = *message ^ 31;
message++;
}
}
信息隐藏器.c

#include <stdio.h>
#include "encrypt.h"

int main() {
char msg[80];
while (fgets(msg, 80, stdin)) {
encrypt(msg);
printf("%s", msg);
}
}
生成文件

message_hider: message_hider.o encrypt.o
    gcc message_hider.o encrypt.o -o message_hider
message_hider.o: message_hider.c encrypt.h
    gcc -c message_hider.c
encrypt.o: encrypt.c encrypt.h
    gcc -c encrypt.c
错误消息

$ make message_hider
cc   message_hider.o   -o message_hider
message_hider.o:message_hider.c:(.text+0x17): undefined reference to `encrypt'
message_hider.o:message_hider.c:(.text+0x17): relocation truncated to fit: R_X86_64_PC32       against undefined symbol `encrypt'
/usr/lib/gcc/x86_64-pc-cygwin/4.8.2/../../../../x86_64-pc-cygwin/bin/ld:     message_hider.o: bad reloc address 0x0 in section `.pdata'
/usr/lib/gcc/x86_64-pc-cygwin/4.8.2/../../../../x86_64-pc-cygwin/bin/ld: final link    failed: Invalid operation
collect2: error: ld returned 1 exit status
<builtin>: recipe for target 'message_hider' failed
make: *** [message_hider] Error 1
$make message\u hider
cc message\u hider.o-o message\u hider
message_hider.o:message_hider.c:(.text+0x17):对“encrypt”的未定义引用
message_hider.o:message_hider.c:(.text+0x17):根据未定义的符号“encrypt”截断重新定位以适应:R_X86_64_PC32
/usr/lib/gcc/x86_64-pc-cygwin/4.8.2/../../../../../../../../x86_64-pc-cygwin/bin/ld:message\u hider.o:“.pdata”部分中的错误重新链接地址0x0
/usr/lib/gcc/x86_64-pc-cygwin/4.8.2/../../../../../../../../x86_64-pc-cygwin/bin/ld:最终链接失败:操作无效
collect2:错误:ld返回了1个退出状态
:目标“消息隐藏器”的配方失败
make:**[消息隐藏]错误1
这不是您在makefile中指定的规则。首先,它似乎使用了
cc
而不是
gcc
。其次,这里没有提到
encrypt.o
,这就是链接失败的原因

尝试显式使用makefile,例如:

make -f Makefile message_hider
这可能是因为它选择了一个不同的makefile,一个具有不同规则的makefile,或者一个仅仅依赖于默认规则的makefile,比如
.c.o


并且,根据您的最新信息:

make -f Makefile message_hider
给你:

$ make -f Makefile message_hider
make: Makefile: No such file or directory
make: *** No rule to make target 'Makefile'. Stop.
这就是当
Makefile
实际上不存在时所得到的错误

因此,您需要检查它是否在当前目录中,并且名称是否与您期望的完全一致

这将解释前面提到的默认规则的使用,因为您的makefile实际上没有被拾取


另一件需要检查的事情是,尽管我们已经看到了上面的错误,这可能是没有意义的,但实际上您正在运行正确的
make
程序。使用
which make
查找它的位置(在CygWin上应该是
/usr/bin/make
),并使用
make--version
检查版本。

它似乎根本没有使用您的makefile。尝试将
message\u hider
规则(
gcc message\u hider.o…
)中的命令替换为
echo building$@
,并告诉我们发生了什么。我替换了它,它出现了完全相同的错误
make--version
的输出是什么,你确定你在makefile中使用的是制表符而不是四个空格吗?是的,我使用的是制表符而不是空格。上面的代码中显示了4个空格,因为SO不允许我插入选项卡。make版本是GNU make 4.0,为x86_64-pc-cygwin构建。当我尝试您在上面编写的命令时,它输出:$make-f Makefile message\u hider make:Makefile:没有这样的文件或目录make:**没有规则将目标设置为“Makefile”。Stop.which make outputs/usr/bin/make如您所述,版本输出GNU make 4.0,为x86_64-pc构建-cygwin@jeebz88,这是没有生成文件时出现的错误。要么它不在那里,要么它的名字不正确。啊,我知道发生了什么。Makefile以.txt扩展名保存。当我从文件中删除.txt扩展名,或者将其添加到命令中时,它就可以正常工作了。非常感谢!教程没有提到这方面的任何内容,只是说制作一个文本文件。谢谢alot@jeebz88,在该上下文中,“生成文本文件”只是指使用文本编辑器生成,而不是必须具有“.txt”扩展名。不管怎么说,很高兴把它说出来。
make -f Makefile message_hider
$ make -f Makefile message_hider
make: Makefile: No such file or directory
make: *** No rule to make target 'Makefile'. Stop.