makefile - 将新源文件添加到 lwip-tap 的依赖项问题
问题描述
我正在尝试向 lwip-tap ( https://github.com/takayuki/lwip-tap ) 添加一个新的源文件,但是在执行时遇到了一些问题
$ make
我正在遵循代码的其他示例的实现方式。我正在创建一个“test.h”和一个“test.c”,其功能与 udp 示例相同(更改函数名称以避免冲突)。
然后我在 makefile.in 中添加依赖项,就像我看到添加了其他依赖项一样:
首先-Ilwip-contrib/apps/test
srcdir = @srcdir@
prefix = @prefix@
exec_prefix = $(prefix)
bindir = $(exec_prefix)/bin
sbindir = $(exec_prefix)/sbin
libexecdir = $(exec_prefix)/libexec
datadir = $(prefix)/share
IP_VERSION = 4
CC = @CC@
CPPFLAGS = @DEFS@ -I. -Ilwip-contrib/ports/unix/include \
-Ilwip/src/include/ipv$(IP_VERSION) -Ilwip/src/include \
-Ilwip-contrib/apps/chargen -Ilwip-contrib/apps/httpserver \
-Ilwip-contrib/apps/tcpecho -Ilwip-contrib/apps/udpecho -Ilwip-contrib/apps/test @CPPFLAGS@
CFLAGS = -pthread -Wall @CFLAGS@
LDFLAGS = -pthread @LDFLAGS@
LIBS = @LIBS@
INSTALL = @INSTALL@
第二个lwip-contrib/apps/test/test.c
SOURCES = \
lwip/src/api/api_lib.c \
lwip/src/api/api_msg.c \
lwip/src/api/err.c \
lwip/src/api/netbuf.c \
lwip/src/api/netdb.c \
lwip/src/api/netifapi.c \
lwip/src/api/sockets.c \
lwip/src/api/tcpip.c \
lwip/src/core/def.c \
lwip/src/core/dhcp.c \
lwip/src/core/dns.c \
lwip/src/core/init.c \
lwip/src/core/mem.c \
lwip/src/core/memp.c \
lwip/src/core/netif.c \
lwip/src/core/pbuf.c \
lwip/src/core/raw.c \
lwip/src/core/stats.c \
lwip/src/core/sys.c \
lwip/src/core/tcp.c \
lwip/src/core/tcp_in.c \
lwip/src/core/tcp_out.c \
lwip/src/core/timers.c \
lwip/src/core/udp.c \
lwip/src/core/ipv4/autoip.c \
lwip/src/core/ipv4/icmp.c \
lwip/src/core/ipv4/igmp.c \
lwip/src/core/ipv4/inet.c \
lwip/src/core/ipv4/inet_chksum.c \
lwip/src/core/ipv4/ip.c \
lwip/src/core/ipv4/ip_addr.c \
lwip/src/core/ipv4/ip_frag.c \
lwip/src/core/snmp/asn1_dec.c \
lwip/src/core/snmp/asn1_enc.c \
lwip/src/core/snmp/mib2.c \
lwip/src/core/snmp/mib_structs.c \
lwip/src/core/snmp/msg_in.c \
lwip/src/core/snmp/msg_out.c \
lwip/src/netif/etharp.c \
lwip-contrib/ports/unix/sys_arch.c \
lwip-contrib/apps/chargen/chargen.c \
lwip-contrib/apps/httpserver/httpserver-netconn.c \
lwip-contrib/apps/tcpecho/tcpecho.c \
lwip-contrib/apps/udpecho/udpecho.c \
lwip-contrib/apps/test/test.c \
tapif.c \
lwip-tap.c
我没有动过makefile的最后一部分
OBJS := $(foreach f,$(SOURCES),$(notdir $(f:.c=.o)))
%.o:
$(CC) $(CFLAGS) $(CPPFLAGS) -c $<
.PHONY: all check-syntax depend dep clean distclean
all: lwip-tap
lwip-tap: $(OBJS)
$(CC) $(LDFLAGS) $(LIBS) -o lwip-tap $(OBJS)
check-syntax:
$(CC) $(CFLAGS) $(CPPFLAGS) -fsyntax-only $(CHK_SOURCES)
depend dep:
$(CC) $(CFLAGS) $(CPPFLAGS) -MM $(SOURCES) >.depend
clean:
rm -f config.cache config.log
rm -f lwip-tap $(OBJS) *~
distclean: clean
rm -f Makefile config.h config.status
rm -rf autom4te.cache
ifeq (.depend,$(wildcard .depend))
include .depend
endif
当我执行 ./configure 时它工作正常,但是当我执行 make 时,我得到:
rr@ubuntu:~/Desktop/test/lwip-tap$ make
gcc -pthread -Wall -g -O2 -DHAVE_CONFIG_H -I. -Ilwip-contrib/ports/unix/include -Ilwip/src/include/ipv4 -Ilwip/src/include -Ilwip-contrib/apps/chargen -Ilwip-contrib/apps/httpserver -Ilwip-contrib/apps/tcpecho -Ilwip-contrib/apps/udpecho -Ilwip-contrib/apps/test -c
gcc: fatal error: no input files
compilation terminated.
Makefile:94: recipe for target 'test.o' failed
make: *** [test.o] Error 1
我错过了什么吗?
编辑:
我已经意识到,如果我将源添加到 SOURCES 变量中,它就不会像其他源一样工作。例如,如果我在这里添加我的源文件:
SOURCES = \
lwip/src/api/api_lib.c \
lwip-contrib/apps/test/test.c \
make 的输出是:
gcc -pthread -Wall -g -O2 -DHAVE_CONFIG_H -I. -Ilwip-contrib/ports/unix/include -Ilwip/src/include/ipv4 -Ilwip/src/include -Ilwip-contrib/apps/chargen -Ilwip-contrib/apps/httpserver -Ilwip-contrib/apps/tcpecho -Ilwip-contrib/apps/udpecho -c lwip/src/api/api_lib.c
gcc -pthread -Wall -g -O2 -DHAVE_CONFIG_H -I. -Ilwip-contrib/ports/unix/include -Ilwip/src/include/ipv4 -Ilwip/src/include -Ilwip-contrib/apps/chargen -Ilwip-contrib/apps/httpserver -Ilwip-contrib/apps/tcpecho -Ilwip-contrib/apps/udpecho -c
gcc: fatal error: no input files
compilation terminated.
Makefile:94: recipe for target 'test.o' failed
make: *** [test.o] Error 1
为什么它在第一种情况下在末尾添加“lwip/src/api/api_lib.c”但在第二种情况下没有添加“lwip-contrib/apps/test/test.c”?
解决方案
您没有在任何地方声明 .o 文件依赖于 .c 文件。
此模式规则:
%.o:
$(CC) $(CFLAGS) $(CPPFLAGS) -c $<
说你可以从一无所有(没有先决条件)构建一个 .o 文件,但是它使用$<
自动变量扩展到第一个先决条件。必须在某处明确定义先决条件,如:
sys_arch.o : lwip-contrib/ports/unix/sys_arch.c
但是在您的 makefile 中,您尚未创建这些先决条件语句,因此该$<
变量为空(没有先决条件)。
推荐阅读
- javascript - React 图表,但它看起来很特别
- windows - 我怎么能杀死“abc.exe”的所有任务,除了具有特定PID的任务?
- java - java - 如何将函数作为参数从java传递给kotlin方法?
- python - 如何以特定顺序对第一个字母进行排序,以其他特定顺序对第二个字母进行排序
- r - R 等效于具有内部连接和条件的更新查询
- python - 如何从 csv 数据集中找到唯一的痕迹?
- python-2.7 - 如何使用 matplotlib 表示 x 和 y 轴上的数据
- macos - MacOS - 一行命令在终端中工作,但不在 .sh 脚本中?
- sql - SQL Select 语句,使用 convert 将 Format mmddyy 更改为 dd-mon-yyyy
- javascript - 使用 Node.js 和 JavaScript 从缓冲区渲染 PDF