gpt4 book ai didi

gcc - 关于 Makefile 的问题 - 什么是 "$+"& .c 文件/依赖项在哪里调用?

转载 作者:行者123 更新时间:2023-12-05 00:31:38 24 4
gpt4 key购买 nike

我遇到了这个 Makefile(通过一个名为 sendip 的开源项目找到它)

我对这个文件有两个困惑 -

  • 在哪里.c文件在这里被指定为依赖项?虽然所有的图书馆都喜欢 ipv6.so , tcp.so正在生成良好,但这里哪一行负责呢?

  • 我认为这是行.....对吧??
    %.so: %.c $(LIBS)
    $(CC) -o $@ $(CFLAGS) $(LIBCFLAGS) $+ $(LIBS)

    但是 $(LIBS)只指定一些 .o 文件。这是 $+在做什么?

    2.我从没听说过 $+ .我试图找到它并遇到了许多其他人,例如 $? , $@ , $<等,但从未见过这个。我认为它的行为类似于 $?但它仍然需要 .c要指定的依赖关系。

    生成文件:
    #configureable stuff 

    PREFIX ?= /usr/local
    BINDIR ?= $(PREFIX)/bin
    MANDIR ?= $(PREFIX)/share/man/man1
    LIBDIR ?= $(PREFIX)/lib/sendip

    #For most systems, this works
    INSTALL ?= install

    #For Solaris, you may need
    #INSTALL=/usr/ucb/install

    CFLAGS= -fPIC -fsigned-char -pipe -Wall -Wpointer-arith -Wwrite-strings \
    -Wstrict-prototypes -Wnested-externs -Winline -Werror -g -Wcast-align \
    -DSENDIP_LIBS=\"$(LIBDIR)\"

    #-Wcast-align causes problems on solaris, but not serious ones

    LDFLAGS= -g -rdynamic -lm -ldl
    #LDFLAGS_SOLARIS= -g -lsocket -lnsl -lm
    LDFLAGS_SOLARIS= -g -lsocket -lnsl -lm -ldl
    LDFLAGS_LINUX= -g -rdynamic -lm -ldl
    LIBCFLAGS= -shared
    CC= gcc-4.4

    PROGS= sendip
    BASEPROTOS= ipv4.so ipv6.so
    IPPROTOS= tcp.so udp.so icmp.so
    UDPPROTOS= rip.so ripng.so ntp.so
    TCPPROTOS= bgp.so
    PROTOS= $(BASEPROTOS) $(IPPROTOS) $(UDPPROTOS) $(TCPPROTOS)
    LIBS= libsendipaux.a
    LIBOBJS= csum.o compact.o protoname.o headers.o parseargs.o
    cryptomod.o crc32.o
    SUBDIRS= mec

    all: $(LIBS) subdirs sendip $(PROTOS) sendip.1 sendip.spec

    #there has to be a nice way to do this

    sendip: sendip.o gnugetopt.o gnugetopt1.o compact.o
    sh -c "if [ `uname` = Linux ] ; then \
    $(CC) -o $@ $(LDFLAGS_LINUX) $(CFLAGS) $+ ; \
    elif [ `uname` = SunOS ] ; then \
    $(CC) -o $@ $(LDFLAGS_SOLARIS) $(CFLAGS) $+ ;\
    else \
    $(CC) -o $@ $(LDFLAGS) $(CFLAGS) $+ ; \
    fi"

    libsendipaux.a: $(LIBOBJS)
    ar vr $@ $?

    subdirs:
    for subdir in $(SUBDIRS) ; do \
    cd $$subdir ;\
    make ;\
    cd .. ;\
    done

    protoname.o: mec/protoname.c
    $(CC) -o $@ -c -I. $(CFLAGS) $+

    headers.o: mec/headers.c
    $(CC) -o $@ -c -I. $(CFLAGS) $+

    parseargs.o: mec/parseargs.c
    $(CC) -o $@ -c -I. $(CFLAGS) $+

    cryptomod.o: mec/cryptomod.c
    $(CC) -o $@ -c -I. $(CFLAGS) $+

    crc32.o: mec/crc32table.h mec/crc32.c
    $(CC) -o $@ -c -I. $(CFLAGS) mec/crc32.c

    mec/crc32table.h: mec/gen_crc32table
    mec/gen_crc32table > mec/crc32table.h

    sendip.1: ./help2man $(PROGS) $(PROTOS) subdirs VERSION
    ./help2man -n "Send arbitrary IP packets" -N >sendip.1

    最佳答案

    你是对的。

    当目标定义以 % 开头时字符它定义了一个目标模式,而不是一个特定的模式。所以%.so表示生成其他目标所需或用户所需的所有 .so 文件的目标。 %.c也是一种模式,意味着所有 .c文件。

    所以$(CC) -o $@ $(CFLAGS) $(LIBCFLAGS) $+ $(LIBS)意味着命令输出将具有正在生成的目标的名称($@ -> 与模式匹配的目标的名称)...和 ​​$+表示与 prerequisite 匹配的所有文件模式(即: %.c )。

    查看 GNU make 手册,特别是在 Catalogue of Rules看什么$+ , $^ , ... 意思。

    关于gcc - 关于 Makefile 的问题 - 什么是 "$+"& .c 文件/依赖项在哪里调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14431581/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com