首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有子目录的gmake

带有子目录的gmake
EN

Stack Overflow用户
提问于 2022-08-04 00:04:32
回答 1查看 46关注 0票数 -1

我有一个用于pmake的makefile,而不是GNU make。我只是把它从一个琐碎的makefile转移到了一个更复杂的问题上,这个问题出现在了src中,并包含了目录。

我不能使用GNU特定的语法,它需要可移植。

问题是.c.o从未被处理过,所以.c文件从未编译到.o。

代码语言:javascript
运行
复制
gcc -o hello main.o display.o  
/usr/bin/ld: cannot find main.o: No such file or directory
/usr/bin/ld: cannot find display.o: No such file or directory
collect2: error: ld returned 1 exit status
make: *** [makefile4:13: hello] Error 1

makefile如下所示:

代码语言:javascript
运行
复制
.SUFFIXES:

OBJECTS=main.o display.o
BINARY=hello
CC=gcc
CFLAGS_ALL=$(CFLAGS) -Iinclude -std=c17 -Wall -Wextra -Wpedantic

.PHONY: all
all: $(BINARY)

hello: $(OBJECTS)
        $(CC) -o $(BINARY) $(OBJECTS) $(LDFLAGS) $(LIBRARIES)

main.o: src/main.c include/display.h
display.o: src/display.c include/display.h

.SUFFIXES: .o .c

.c.o:
        $(CC) $(CFLAGS_ALL) -o $@ -c $<

.PHONY: clean
clean:
        rm -rf $(OBJECTS) $(BINARY) $(DOCS)

对于能说服GNU工作的语法有什么想法吗?

使用-d的输出是:

代码语言:javascript
运行
复制
GNU Make 4.3
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Reading makefiles...
Reading makefile 'makefile4'...
Updating makefiles....
 Considering target file 'makefile4'.
  Looking for an implicit rule for 'makefile4'.
  Trying pattern rule with stem 'makefile4'.
  Trying implicit prerequisite 'makefile4.o'.
  Trying pattern rule with stem 'makefile4'.
  Trying implicit prerequisite 'makefile4.c'.
  Trying pattern rule with stem 'makefile4'.
  Trying implicit prerequisite 'makefile4,v'.
  Trying pattern rule with stem 'makefile4'.
  Trying implicit prerequisite 'RCS/makefile4,v'.
  Trying pattern rule with stem 'makefile4'.
  Trying implicit prerequisite 'RCS/makefile4'.
  Trying pattern rule with stem 'makefile4'.
  Trying implicit prerequisite 's.makefile4'.
  Trying pattern rule with stem 'makefile4'.
  Trying implicit prerequisite 'SCCS/s.makefile4'.
  Trying pattern rule with stem 'makefile4'.
  Trying implicit prerequisite 'makefile4.o'.
  Looking for a rule with intermediate file 'makefile4.o'.
   Avoiding implicit rule recursion.
   Trying pattern rule with stem 'makefile4'.
   Trying implicit prerequisite 'makefile4.c'.
   Trying pattern rule with stem 'makefile4.o'.
   Trying implicit prerequisite 'makefile4.o,v'.
   Trying pattern rule with stem 'makefile4.o'.
   Trying implicit prerequisite 'RCS/makefile4.o,v'.
   Trying pattern rule with stem 'makefile4.o'.
   Trying implicit prerequisite 'RCS/makefile4.o'.
   Trying pattern rule with stem 'makefile4.o'.
   Trying implicit prerequisite 's.makefile4.o'.
   Trying pattern rule with stem 'makefile4.o'.
   Trying implicit prerequisite 'SCCS/s.makefile4.o'.
   Trying pattern rule with stem 'makefile4'.
   Trying implicit prerequisite 'makefile4.c'.
   Looking for a rule with intermediate file 'makefile4.c'.
    Avoiding implicit rule recursion.
    Avoiding implicit rule recursion.
    Trying pattern rule with stem 'makefile4'.
    Trying implicit prerequisite 'makefile4.w'.
    Trying pattern rule with stem 'makefile4.c'.
    Trying implicit prerequisite 'makefile4.c,v'.
    Trying pattern rule with stem 'makefile4.c'.
    Trying implicit prerequisite 'RCS/makefile4.c,v'.
    Trying pattern rule with stem 'makefile4.c'.
    Trying implicit prerequisite 'RCS/makefile4.c'.
    Trying pattern rule with stem 'makefile4.c'.
    Trying implicit prerequisite 's.makefile4.c'.
    Trying pattern rule with stem 'makefile4.c'.
    Trying implicit prerequisite 'SCCS/s.makefile4.c'.
    Trying pattern rule with stem 'makefile4'.
    Trying implicit prerequisite 'makefile4.w'.
    Looking for a rule with intermediate file 'makefile4.w'.
     Avoiding implicit rule recursion.
     Avoiding implicit rule recursion.
     Avoiding implicit rule recursion.
     Trying pattern rule with stem 'makefile4.w'.
     Trying implicit prerequisite 'makefile4.w,v'.
     Trying pattern rule with stem 'makefile4.w'.
     Trying implicit prerequisite 'RCS/makefile4.w,v'.
     Trying pattern rule with stem 'makefile4.w'.
     Trying implicit prerequisite 'RCS/makefile4.w'.
     Trying pattern rule with stem 'makefile4.w'.
     Trying implicit prerequisite 's.makefile4.w'.
     Trying pattern rule with stem 'makefile4.w'.
     Trying implicit prerequisite 'SCCS/s.makefile4.w'.
  Trying pattern rule with stem 'makefile4'.
  Rejecting impossible implicit prerequisite 'makefile4.c'.
  No implicit rule found for 'makefile4'.
  Finished prerequisites of target file 'makefile4'.
 No need to remake target 'makefile4'.
Updating goal targets....
Considering target file 'all'.
 File 'all' does not exist.
  Considering target file 'hello'.
   File 'hello' does not exist.
    Considering target file 'main.o'.
     File 'main.o' does not exist.
     Looking for an implicit rule for 'main.o'.
     Trying pattern rule with stem 'main'.
     Trying implicit prerequisite 'main.c'.
     Trying pattern rule with stem 'main.o'.
     Trying implicit prerequisite 'main.o,v'.
     Trying pattern rule with stem 'main.o'.
     Trying implicit prerequisite 'RCS/main.o,v'.
     Trying pattern rule with stem 'main.o'.
     Trying implicit prerequisite 'RCS/main.o'.
     Trying pattern rule with stem 'main.o'.
     Trying implicit prerequisite 's.main.o'.
     Trying pattern rule with stem 'main.o'.
     Trying implicit prerequisite 'SCCS/s.main.o'.
     Trying pattern rule with stem 'main'.
     Trying implicit prerequisite 'main.c'.
     Looking for a rule with intermediate file 'main.c'.
      Avoiding implicit rule recursion.
      Trying pattern rule with stem 'main'.
      Trying implicit prerequisite 'main.w'.
      Trying pattern rule with stem 'main.c'.
      Trying implicit prerequisite 'main.c,v'.
      Trying pattern rule with stem 'main.c'.
      Trying implicit prerequisite 'RCS/main.c,v'.
      Trying pattern rule with stem 'main.c'.
      Trying implicit prerequisite 'RCS/main.c'.
      Trying pattern rule with stem 'main.c'.
      Trying implicit prerequisite 's.main.c'.
      Trying pattern rule with stem 'main.c'.
      Trying implicit prerequisite 'SCCS/s.main.c'.
      Trying pattern rule with stem 'main'.
      Trying implicit prerequisite 'main.w'.
      Looking for a rule with intermediate file 'main.w'.
       Avoiding implicit rule recursion.
       Avoiding implicit rule recursion.
       Trying pattern rule with stem 'main.w'.
       Trying implicit prerequisite 'main.w,v'.
       Trying pattern rule with stem 'main.w'.
       Trying implicit prerequisite 'RCS/main.w,v'.
       Trying pattern rule with stem 'main.w'.
       Trying implicit prerequisite 'RCS/main.w'.
       Trying pattern rule with stem 'main.w'.
       Trying implicit prerequisite 's.main.w'.
       Trying pattern rule with stem 'main.w'.
       Trying implicit prerequisite 'SCCS/s.main.w'.
     No implicit rule found for 'main.o'.
      Considering target file 'src/main.c'.
       Looking for an implicit rule for 'src/main.c'.
       Trying pattern rule with stem 'main'.
       Trying implicit prerequisite 'src/main.w'.
       Trying pattern rule with stem 'main.c'.
       Trying implicit prerequisite 'src/main.c,v'.
       Trying pattern rule with stem 'main.c'.
       Trying implicit prerequisite 'src/RCS/main.c,v'.
       Trying pattern rule with stem 'main.c'.
       Trying implicit prerequisite 'src/RCS/main.c'.
       Trying pattern rule with stem 'main.c'.
       Trying implicit prerequisite 'src/s.main.c'.
       Trying pattern rule with stem 'main.c'.
       Trying implicit prerequisite 'src/SCCS/s.main.c'.
       Trying pattern rule with stem 'main'.
       Trying implicit prerequisite 'src/main.w'.
       Looking for a rule with intermediate file 'src/main.w'.
        Avoiding implicit rule recursion.
        Trying pattern rule with stem 'main.w'.
        Trying implicit prerequisite 'src/main.w,v'.
        Trying pattern rule with stem 'main.w'.
        Trying implicit prerequisite 'src/RCS/main.w,v'.
        Trying pattern rule with stem 'main.w'.
        Trying implicit prerequisite 'src/RCS/main.w'.
        Trying pattern rule with stem 'main.w'.
        Trying implicit prerequisite 'src/s.main.w'.
        Trying pattern rule with stem 'main.w'.
        Trying implicit prerequisite 'src/SCCS/s.main.w'.
       No implicit rule found for 'src/main.c'.
       Finished prerequisites of target file 'src/main.c'.
      No need to remake target 'src/main.c'.
      Considering target file 'include/display.h'.
       Looking for an implicit rule for 'include/display.h'.
       Trying pattern rule with stem 'display.h'.
       Trying implicit prerequisite 'include/display.h.o'.
       Trying pattern rule with stem 'display.h'.
       Trying implicit prerequisite 'include/display.h.c'.
       Trying pattern rule with stem 'display.h'.
       Trying implicit prerequisite 'include/display.h,v'.
       Trying pattern rule with stem 'display.h'.
       Trying implicit prerequisite 'include/RCS/display.h,v'.
       Trying pattern rule with stem 'display.h'.
       Trying implicit prerequisite 'include/RCS/display.h'.
       Trying pattern rule with stem 'display.h'.
       Trying implicit prerequisite 'include/s.display.h'.
       Trying pattern rule with stem 'display.h'.
       Trying implicit prerequisite 'include/SCCS/s.display.h'.
       Trying pattern rule with stem 'display.h'.
       Trying implicit prerequisite 'include/display.h.o'.
       Looking for a rule with intermediate file 'include/display.h.o'.
        Avoiding implicit rule recursion.
        Trying pattern rule with stem 'display.h'.
        Trying implicit prerequisite 'include/display.h.c'.
        Trying pattern rule with stem 'display.h.o'.
        Trying implicit prerequisite 'include/display.h.o,v'.
        Trying pattern rule with stem 'display.h.o'.
        Trying implicit prerequisite 'include/RCS/display.h.o,v'.
        Trying pattern rule with stem 'display.h.o'.
        Trying implicit prerequisite 'include/RCS/display.h.o'.
        Trying pattern rule with stem 'display.h.o'.
        Trying implicit prerequisite 'include/s.display.h.o'.
        Trying pattern rule with stem 'display.h.o'.
        Trying implicit prerequisite 'include/SCCS/s.display.h.o'.
        Trying pattern rule with stem 'display.h'.
        Trying implicit prerequisite 'include/display.h.c'.
        Looking for a rule with intermediate file 'include/display.h.c'.
         Avoiding implicit rule recursion.
         Avoiding implicit rule recursion.
         Trying pattern rule with stem 'display.h'.
         Trying implicit prerequisite 'include/display.h.w'.
         Trying pattern rule with stem 'display.h.c'.
         Trying implicit prerequisite 'include/display.h.c,v'.
         Trying pattern rule with stem 'display.h.c'.
         Trying implicit prerequisite 'include/RCS/display.h.c,v'.
         Trying pattern rule with stem 'display.h.c'.
         Trying implicit prerequisite 'include/RCS/display.h.c'.
         Trying pattern rule with stem 'display.h.c'.
         Trying implicit prerequisite 'include/s.display.h.c'.
         Trying pattern rule with stem 'display.h.c'.
         Trying implicit prerequisite 'include/SCCS/s.display.h.c'.
         Trying pattern rule with stem 'display.h'.
         Trying implicit prerequisite 'include/display.h.w'.
         Looking for a rule with intermediate file 'include/display.h.w'.
          Avoiding implicit rule recursion.
          Avoiding implicit rule recursion.
          Avoiding implicit rule recursion.
          Trying pattern rule with stem 'display.h.w'.
          Trying implicit prerequisite 'include/display.h.w,v'.
          Trying pattern rule with stem 'display.h.w'.
          Trying implicit prerequisite 'include/RCS/display.h.w,v'.
          Trying pattern rule with stem 'display.h.w'.
          Trying implicit prerequisite 'include/RCS/display.h.w'.
          Trying pattern rule with stem 'display.h.w'.
          Trying implicit prerequisite 'include/s.display.h.w'.
          Trying pattern rule with stem 'display.h.w'.
          Trying implicit prerequisite 'include/SCCS/s.display.h.w'.
       Trying pattern rule with stem 'display.h'.
       Rejecting impossible implicit prerequisite 'include/display.h.c'.
       No implicit rule found for 'include/display.h'.
       Finished prerequisites of target file 'include/display.h'.
      No need to remake target 'include/display.h'.
     Finished prerequisites of target file 'main.o'.
    Must remake target 'main.o'.
    Successfully remade target file 'main.o'.
    Considering target file 'display.o'.
     File 'display.o' does not exist.
     Looking for an implicit rule for 'display.o'.
     Trying pattern rule with stem 'display'.
     Trying implicit prerequisite 'display.c'.
     Trying pattern rule with stem 'display.o'.
     Trying implicit prerequisite 'display.o,v'.
     Trying pattern rule with stem 'display.o'.
     Trying implicit prerequisite 'RCS/display.o,v'.
     Trying pattern rule with stem 'display.o'.
     Trying implicit prerequisite 'RCS/display.o'.
     Trying pattern rule with stem 'display.o'.
     Trying implicit prerequisite 's.display.o'.
     Trying pattern rule with stem 'display.o'.
     Trying implicit prerequisite 'SCCS/s.display.o'.
     Trying pattern rule with stem 'display'.
     Trying implicit prerequisite 'display.c'.
     Looking for a rule with intermediate file 'display.c'.
      Avoiding implicit rule recursion.
      Trying pattern rule with stem 'display'.
      Trying implicit prerequisite 'display.w'.
      Trying pattern rule with stem 'display.c'.
      Trying implicit prerequisite 'display.c,v'.
      Trying pattern rule with stem 'display.c'.
      Trying implicit prerequisite 'RCS/display.c,v'.
      Trying pattern rule with stem 'display.c'.
      Trying implicit prerequisite 'RCS/display.c'.
      Trying pattern rule with stem 'display.c'.
      Trying implicit prerequisite 's.display.c'.
      Trying pattern rule with stem 'display.c'.
      Trying implicit prerequisite 'SCCS/s.display.c'.
      Trying pattern rule with stem 'display'.
      Trying implicit prerequisite 'display.w'.
      Looking for a rule with intermediate file 'display.w'.
       Avoiding implicit rule recursion.
       Avoiding implicit rule recursion.
       Trying pattern rule with stem 'display.w'.
       Trying implicit prerequisite 'display.w,v'.
       Trying pattern rule with stem 'display.w'.
       Trying implicit prerequisite 'RCS/display.w,v'.
       Trying pattern rule with stem 'display.w'.
       Trying implicit prerequisite 'RCS/display.w'.
       Trying pattern rule with stem 'display.w'.
       Trying implicit prerequisite 's.display.w'.
       Trying pattern rule with stem 'display.w'.
       Trying implicit prerequisite 'SCCS/s.display.w'.
     No implicit rule found for 'display.o'.
      Considering target file 'src/display.c'.
       Looking for an implicit rule for 'src/display.c'.
       Trying pattern rule with stem 'display'.
       Trying implicit prerequisite 'src/display.w'.
       Trying pattern rule with stem 'display.c'.
       Trying implicit prerequisite 'src/display.c,v'.
       Trying pattern rule with stem 'display.c'.
       Trying implicit prerequisite 'src/RCS/display.c,v'.
       Trying pattern rule with stem 'display.c'.
       Trying implicit prerequisite 'src/RCS/display.c'.
       Trying pattern rule with stem 'display.c'.
       Trying implicit prerequisite 'src/s.display.c'.
       Trying pattern rule with stem 'display.c'.
       Trying implicit prerequisite 'src/SCCS/s.display.c'.
       Trying pattern rule with stem 'display'.
       Trying implicit prerequisite 'src/display.w'.
       Looking for a rule with intermediate file 'src/display.w'.
        Avoiding implicit rule recursion.
        Trying pattern rule with stem 'display.w'.
        Trying implicit prerequisite 'src/display.w,v'.
        Trying pattern rule with stem 'display.w'.
        Trying implicit prerequisite 'src/RCS/display.w,v'.
        Trying pattern rule with stem 'display.w'.
        Trying implicit prerequisite 'src/RCS/display.w'.
        Trying pattern rule with stem 'display.w'.
        Trying implicit prerequisite 'src/s.display.w'.
        Trying pattern rule with stem 'display.w'.
        Trying implicit prerequisite 'src/SCCS/s.display.w'.
       No implicit rule found for 'src/display.c'.
       Finished prerequisites of target file 'src/display.c'.
      No need to remake target 'src/display.c'.
      Pruning file 'include/display.h'.
     Finished prerequisites of target file 'display.o'.
    Must remake target 'display.o'.
    Successfully remade target file 'display.o'.
   Finished prerequisites of target file 'hello'.
  Must remake target 'hello'.
gcc -o hello main.o display.o  
Putting child 0x55f5c3999ea0 (hello) PID 167980 on the chain.
Live child 0x55f5c3999ea0 (hello) PID 167980 
/usr/bin/ld: cannot find main.o: No such file or directory
/usr/bin/ld: cannot find display.o: No such file or directory
collect2: error: ld returned 1 exit status
Reaping losing child 0x55f5c3999ea0 PID 167980 
make: *** [makefile4:15: hello] Error 1
Removing child 0x55f5c3999ea0 PID 167980 from chain.
EN

回答 1

Stack Overflow用户

发布于 2022-08-04 06:55:03

我不高兴的解决办法是:

代码语言:javascript
运行
复制
OBJECTS=$(SRC)/main.o $(SRC)/display.o
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73229033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档