【问题标题】:Creating Makefile for source file in parent directory在父目录中为源文件创建 Makefile
【发布时间】:2020-10-11 21:46:51
【问题描述】:
---src
    ---U
       ---B
         ---D
           ---L
             ---T
                ---F
                 main.c
                 Makefile 

我在 main.c 中编写了一个程序,它需要一个位于目录 L/ 内的自定义头文件。头函数的实现存在于 L/ 中的源文件 (src.c) 中。

源文件 src.c 又依赖于与 src.c 或其他顶级目录位于同一目录中的其他自定义源文件和头文件。

我想在 F/ 中编写一个 MakeFile,以便能够根据需要选择那些源文件和头文件并创建一个二进制文件。

我无法编辑/使用现有的 make 文件,因为此过程需要与现有的文件分离,并且还需要单独的工具链和 CFLAGS。

我阅读了有关 VPATH 的信息,但我无法使我的构建工作。

Following MakeFile 不工作,并抱怨找不到 x.o 和其他目标文件。


all: prog

CC = clang-11

CFLAGS= -g -fsanitize=fuzzer
 
#INCLUDES = -I../../../../../B
  
INC = $(INCLUDES)
 
OBJS =  x.o qc.o dl.o l.o d.o
 
LIBS = -lcrypto -luuid

prog: $(OBJ)
    $(CC) $(CFLAGS) $(INC) -o prog $(OBJS) $(LIBS)

x.o: x.c  //do I need to specify other header file dependencies here?
    $(CC) $(INC) -g -c -o x.o x.c

qc.o: qc.c
    $(CC) $(INC) -g -c -o qc.o qc.c

dl.o: dl.c
    $(CC) $(INC) -g -c -o dl.o dl.c

l.o: l.c
    $(CC) $(INC) -g -fsanitize=fuzzer -c -o l.o l.c

d.o: d.c
    $(CC) $(INC) -g -c -o d.o d.c

clean: 
    rm -f *.o prog

我没有编写 make 文件的经验。你能帮我纠正一下吗?

【问题讨论】:

  • 你真的要写一个makefile吗?改用 cmake 怎么样?
  • 如果我们不知道 x.c 和其他源文件的位置,很难修复 makefile。可以使用 VPATH,在这种情况下,它需要源文件所在的目录列表。但是,VPATH 在这里不是强制性的。你需要写下源文件的相对路径../../T/source.c,这样make才能找到。
  • 提示:要将源文件转换为目标文件,您可以执行以下操作:`$(SRC:.c=.o)`

标签: c makefile


【解决方案1】:
x.o: x.c  //do I need to specify other header file dependencies here?
    $(CC) $(INC) -g -c -o x.o x.c

不需要更多的依赖,但需要提供文件的相对路径。示例:

x.o: ../../D/x.c  //do I need to specify other header file dependencies here?
    $(CC) $(INC) -g -c -o x.o ../../D/x.c

建议:简化你的树,太复杂了。

Folder
  src
  inc
  doc

VPATH的使用

它主要用于从源目录中拆分二进制目录。在这种情况下,你有类似的东西:

OBJS = bin/a.o bin/b.o

VPATH = src

当 GNU Make 尝试创建 a.o 时,它会找到 src/a.c。

【讨论】:

  • 第二个$(CC) $(INC) -g -c -o x.o x.c不应该是$(CC) $(INC) -g -c -o x.o ../../D/x.c吗?此外,您稍后在答案中从使用正斜杠目录分隔符切换到反斜杠。
  • @Robert 感谢您的回答。我能够根据您的建议更正文件。我不能随意修改目录结构,因此,使用相对路径对我有用。
  • @IanAbbott 谢谢,这是正确的方法。在我使用以下命令之前,我仍然收到 - No such file or directory 错误 - $(CC) $(INC) -g -c -o x.o ../../D/x.c (这是正确的方法)
猜你喜欢
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多