【问题标题】:Using a Makefile in C (make: *** No rule to make target .. needed by ... Stop在 C 中使用 Makefile (make: *** No rule to make target .. 需要 ... Stop
【发布时间】:2021-08-29 18:19:54
【问题描述】:

我正在尝试在两台设备(例如两台计算机)之间创建一个通信通道,该通道将与加密网络协议 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 文件夹中。

在工作中,我受到了这个话题的启发:enter link description here

运行makefile文件时遇到的问题是: gcc -o .o gcc.exe:致命错误:没有输入文件 编译终止。 make: *** [: .o] 错误 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 编译器 你能告诉我我的错误吗?

【问题讨论】:

  • 目录路径好像不对。也许您的意思是-I../salt_org(两个点)?
  • salti_util.h和`\`之间加一个空格(卡在下一行的第一个单词上)
  • 我也加了个空格,尝试修改源文件的路径,结果还是一样

标签: c makefile


【解决方案1】:

首先,在提出此类问题时,您应该始终包括(通过剪切和粘贴)产生错误的实际编译行,而不仅仅是错误。此类错误的原因总是在编译行中找到。

其次,你的问题是你不应该在编译行包含头文件。由于源文件中的#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 正常工作。

【讨论】:

  • IIANM,您不应该将包含文件指定为 C 编译器的位置参数。
  • 我尝试根据您的示例修复 salt.o,但错误没有改变。从 makefile 列出错误的行是 (recipe for compiling salt_buffer.o) $ (CC) $ (CFLAGS) -c salt_buffer.c salt.h salt_io.h salti_util.h \
  • 当我将makefile文件中的行修复为: salt_buffer.o: salt_buffer.c $ (CC) $ (CFLAGS) -c salt_buffer.c 所以它给了我一个makefile make: ***没有规则来制作“salt.o”所需的目标“salt.c”。停止。 ..但现在我知道编译 salt_buffer.o 的那一行我拼错了
  • 上面你说的错误是它找不到salt.h,在这里你说它找不到salt.c。哪个是对的?如果是salt.h,那么问题很简单:你已经告诉编译器在哪里可以找到头文件,但你没有告诉 make 在哪里可以找到它们。您需要在 makefile 先决条件列表中使用真实的路径名(例如,header_folder/salt.h)。
  • 我编辑了行来编译 salt_buffer.o: salt_buffer.o: salt_buffer.c header_folder/salt.h \ header_folder/salti_util.h header_folder/salti_handshake.h \ header_folder/salt_io.h header_folder/salt_modified。 h $(CC) $(CFLAGS) -c salt_buffer.c ....这告诉我 gcc -o .o gcc.exe:致命错误:没有输入文件编译终止。 make: *** [: .o] 错误 1
猜你喜欢
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多