两种模式规则的差异及makefile的集成

两种模式规则的差异及makefile的集成,makefile,Makefile,我正在学习makefile,我对模式规则的使用和如何使用感到有点困惑: 我有两个问题: 模式规则的差异形式 在一些示例中,我看到了这种形式: .c.o: $(CC) $(CFLAGS) $< -o $@ 我这样做: $(SERV_EXE): $(OBJECTS_SERV) $(CC) $(CFLAGS) -o $@ $^ newDeck.o $(CLI_EXE): $(OBJECTS_CLI) $(CC) $(CFLAGS) -o $@ $^ 但是我想使用模式规则从命令

我正在学习makefile,我对模式规则的使用和如何使用感到有点困惑:

我有两个问题:

  • 模式规则的差异形式
  • 在一些示例中,我看到了这种形式:

    .c.o:
    $(CC) $(CFLAGS) $< -o $@
    
    我这样做:

    $(SERV_EXE): $(OBJECTS_SERV)
        $(CC) $(CFLAGS) -o $@ $^ newDeck.o
    $(CLI_EXE): $(OBJECTS_CLI)
        $(CC) $(CFLAGS) -o $@ $^
    
    但是我想使用模式规则从命令执行
    makebrsserver
    makebrsclient
    。 这样就够了吗

    %.o:%.c
    $(CC)$(CFLAGS)-c$<-o$@


    如您所见,我只需要编写
    brsserver
    ,其中包括一个名为
    newDeck.o
    的模块
    .c.o
    表单是一个后缀规则。POSIX标准中为
    make
    程序定义了此表单

    %.o:%.c
    是一个模式规则。这是一个GNU make特性,不是POSIX标准的一部分(我认为可能还有一些其他make实现具有类似的特性)

    在这种情况下,它们是等价的。然而,模式规则通常比后缀规则灵活得多;例如,您不能这样表示模式规则:

    .PHONY: all brsserver brsclient clean
    CC = gcc
    CFLAGS = -Wall -pedantic -g -lpthread
    
    # source files for server
    SOURCES_SERV = brsserver.c func_client_serv.c comsock.c bris.c users.c aux_func.c Stack.c
    
    # source files for client
    SOURCES_CLI = brsclient.c func_client_serv.c comsock.c bris.c users.c aux_func.c Stack.c
    
    # object file for server
    OBJECTS_SERV = $(SOURCES_SERV:.c = .o)
    
    # object file for client
    OBJECTS_CLI = $(SOURCES_SERV:.c = .o)
    
    # executable file server
    SERV_EXE = brsserver
    
    # executable file client
    CLI_EXE = brsclient
    
    foo%.o : bar%.c
    

    作为后缀规则。

    我不理解你的最后一个问题。为什么
    现在不让brsserver
    让brsclient
    正常工作,因为你有很多东西?我也不明白你说的
    newDeck.o
    是什么意思;在你的例子中没有提到类似的东西,我没有说它不起作用。我只想使用模式规则。正如你所看到的,NewDeck是我用于编译服务器的一个模块。如果你想构建一个新的源文件并链接到服务器,你应该将它添加到
    SOURCES\u SRV
    变量中,而不是链接器规则中。这就是为什么你有一个变量。将
    newDeck.c
    添加到
    SOURCES\u SRV=…
    的末尾,您就完成了。哦,您不应该将
    -lpthread
    添加到
    CFLAGS
    CFLAGS
    采用编译器标志;任何以
    -l
    开头的标志都是一个链接器标志,告诉它在哪里可以找到库。
    -l
    标志通常进入
    LDLIBS
    变量。但是,如果您真的在使用线程,那么仅仅将
    -lpthread
    添加到链接行是不够的。您应该将
    -pthread
    (注意不要
    -lpthread
    !)添加到
    CFLAGS
    ,这样您就不需要使用
    -lpthread
    。谢谢
    -lpthread
    。好的,谢谢您的解释。那么,我必须以何种方式使用模式规则?除了我的汇编之外?对不起,我不明白这个问题。
    foo%.o : bar%.c