相关疑难解决方法(0)

GNU Make.为什么这种复杂的语法生成依赖?

我正在阅读使用GNU Make管理项目,并在第2.7章 - 自动依赖关系生成中找到了这个例子.作者从GNU手册中说出了他们:

%.d: %c
        $(CC) -M $(CPPFLAGS $< > $@.$$$$; \
              sed s',\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
              rm -f $@.$$$$
Run Code Online (Sandbox Code Playgroud)

但是,我能够用这个做同样的事情(注意sed):

-include $(subst .c,.d,$(SOURCES))

%.d: %.c
          @$(CC) -M $(CPPFLAGS) $<  | sed 's|:| $*.d : |'  > $@;
Run Code Online (Sandbox Code Playgroud)

所有这些行都是生成依赖项,然后添加*.d名称.他们不得不改变第一行:

  foo.o: bar.h foo.h fubar.h
Run Code Online (Sandbox Code Playgroud)

to foo.o foo.d:bar.h foo.h fubar.h

我更简单,似乎工作得很好,但我认为GNU伙伴有他们sed命令的理由.也:

  • 为什么要将文件重定向到sed?为什么不简单地将它作为commond line参数
  • 为什么不完全跳过中间文件?

我知道GNU的人也可以想到这些,但出于某种原因,选择了更复杂的设置.我只是想了解他们的推理,所以我可以动态地做这些.

makefile gnu-make

6
推荐指数
2
解决办法
3953
查看次数

Makefile改进,依赖关系生成不起作用

我正在尝试构建一个正确的Makefile.

我想要的是完全控制正在发生的事情,所以我不想要任何第三方软件.

我当前的尝试对我来说似乎是逻辑,但由于依赖关系生成无效,我有点卡住了.

为了更好的可读性,完整的Makefile被分成几小块.如果有什么需要改进,我将不胜感激任何评论.

首先,我有以下静态定义

CXX = g++
CXXFLAGS = -Wall \
           -Wextra \
           -Wuninitialized \
           -Wmissing-declarations \
           -pedantic \
           -O3 \
           -p -g -pg
LDFLAGS =  -p -g -pg
DEPFLAGS = -MM
Run Code Online (Sandbox Code Playgroud)

Afaik这应该没问题.使分析标志可选是完美的,但这并不重要.

SRC_DIR = ./src
OBJ_DIR = ./obj
SRC_EXT = .cpp
OBJ_EXT = .o

TARGET = ./bin/my_target

SRCS = $(wildcard $(SRC_DIR)/*$(SRC_EXT))
OBJS = $(subst $(SRC_DIR), $(OBJ_DIR), $(SRCS:$(SRC_EXT)=$(OBJ_EXT)))
DEP = depend.main
Run Code Online (Sandbox Code Playgroud)

基本上,这应该只是提取所有*.cpp文件出的子文件夹中src,另外更换./src./obj,并.cpp.o作为对象的名称.

.PHONY: clean all depend

all: …
Run Code Online (Sandbox Code Playgroud)

c++ makefile gnu-make

4
推荐指数
1
解决办法
1237
查看次数

标签 统计

gnu-make ×2

makefile ×2

c++ ×1