在C中使用Makefile (make: ***没有规则来制作目标.需要…停止



我正在尝试在两台设备(例如两台计算机)之间创建一个通信通道,它将使用加密网络协议Salt channelv2并相互转发数据。我创建了2个应用程序,其中第一个应用程序演示了Salt channelv2协议的功能,第二个应用程序创建了一个安全的通信通道(特别是使用TCP/IP模型)。应用程序正在工作,我在CLI中使用链接编译它们,现在我正试图创建一个makefile文件,以便为用户轻松编译程序。

这是我的Makefile:
CC=gcc
CFLAGS=-O2 -Wall -g -fcommon  -I./salt_org -I./header_folders  -I./library
#LDFLAGS= 
all:program
program: salt_buffer.o libcrypto.a
$(CC) $(CFLAGS) -o program.exe salt_buffer.o libcrypto.a
randombytes.o: randombytes.c
$(CC) $(CFLAGS)  -c randombytes.c
tweetnacl_modified.o: tweetnacl_modified.c tweetnacl_modified.h
$(CC) $(CFLAGS)  -c tweetnacl_modified.c
tweetnacl_modified_wrapper.o: tweetnacl_modified_wrapper.c
$(CC) $(CFLAGS) -c tweetnacl_modified_wrapper.c
salt.o: salt.c salt.h salti_handshake.h salti_util.h
$(CC) $(CFLAGS) -c salt.c
salt_io.o: salt_io.c salti_util.h 
$(CC) $(CFLAGS) -c salt_io.c
salti_handshake.o: salti_handshake.c salti_handshake.h
$(CC) $(CFLAGS) -c salti_handshake.c
salti_util.o: salti_util.c salti_util.h
$(CC) $(CFLAGS) -c salti_util.c
salt_modified.o: salt_modified.c salt_modified.h salt.h
$(CC) $(CFLAGS) -c salt_modified.c
salt_buffer.o: salt_buffer.c header_folders/salt.h 
header_folders/salti_handshake.h header_folders/salti_util.h        
header_folders/salt_modified.h header_folders/salt_io.h 
$(CC) $(CFLAGS) -c salt_buffer.c 
libcrypto.a: salt.o salti_handshake.o salti_util.o salt_io.o tweetnacl_modified_wrapper.o 
tweetnacl_modified.o randombytes.o salt_modified.o
ar -cvq -o libcrypto.a salt.o salti_handshake.o salti_util.o salt_io.o 
tweetnacl_modified_wrapper.o tweetnacl_modified.o randombytes.o salt_modified.o

clean:
rm -f program *.o *.a hlavickove_subory/*.gch

在一个文件夹中是源代码和文件夹,如salt_org, header_folders, library, salt_buffer.c, salt_modified.c和makefile。主程序是salt_buffer.c,而salt_modified.c包含我提供的源文件,其中包含salt_buffer.c所使用的应用程序所需的主体函数。使用辅助源代码,我尝试创建一个静态库libcrypto.a。源代码,如randombytes.c, tweetnacl_modified.c, tweetnacl_modified_wrapper.c在库文件夹中。其他源代码如salt.c、salti_handshake.c、salti_util.c、salt_io.c在salt_org文件夹中。我使用的所有头文件都在header_folders文件夹中。

在工作中,我受到了这个主题的启发:在这里输入链接描述。

运行makefile文件时遇到的问题是:GCC - 0 . 0Gcc.exe:致命错误:没有输入文件编译终止。make: *** [: .o] Error 1

在源文件中,我有像这样的文件路径,例如salt_buffer.c:

#include "salt.h"
#include "salt_io.h"
#include "salti_util.h"
#include "salti_handshake.h"
#include "salt_modified.h"

我使用11.2的Winlibs编译器你能告诉我我的错误吗?

首先,在提出这样的问题时,您应该总是包括(通过剪切和粘贴)生成错误的实际编译行,而不仅仅是错误。出现这种错误的原因总是可以在编译行中找到。

第二,你的问题是你不应该在编译行中包含头文件。由于源文件中的#include ...命令,编译器将包含头文件:您也不能在编译行中包含它们。像这样的规则:

salt.o: salt.c salt.h salti_handshake.h salti_util.h
$(CC) $(CFLAGS) -c salt.c salti_handshake.h salti_util.h

应该是:

salt.o: salt.c salt.h salti_handshake.h salti_util.h
$(CC) $(CFLAGS) -c salt.c

,就这些。对于头文件出现在编译行上的所有其他食谱也是如此。

有很多更好的方法来编写这个makefile,这样你就不必重复这么多次,但是修复上面的问题应该可以让你当前的makefile正常工作。

最新更新