gpt4 book ai didi

c++ - 使用 make 生成依赖项时出错

转载 作者:行者123 更新时间:2023-11-27 23:21:19 25 4
gpt4 key购买 nike

我正在尝试实现论文“Recursive Make Considered Harmful”中概述的非递归 make 解决方案。我目前坚持要生成 *.d 依赖文件。我在下面提供了 makefile、示例 module.mk 和错误。有什么办法可以解决这个问题吗?

MODULES :=      \
module1 \
module2

# define compiler
CC = /opt/local/bin/clang++-mp-3.1

# exclude the following warnings for clang
CLANG_NO_WARN = \
-Wno-c++98-compat \
-Wno-weak-vtables \
-Wno-padded \
-Wno-global-constructors \
-Wno-exit-time-destructors

# look for include files in each of the modules
CFLAGS += \
-g -Weverything -Wall -std=c++11 -stdlib=libc++ $(CLANG_NO_WARN) \
-I../ -I/usr/local/include $(patsubst %, -I%, $(MODULES))

# linker flags
LDFLAGS := \
-stdlib=libc++ \
-L/usr/local/boost_1_50_0/stage/lib -L/usr/local/lib

# extra libraries if required (each module will add to this)
LIBS := \
-lboost_program_options \
-lboost_system \
-lglog \
-lpugixml

# source files to be compiled (each module will add to this)
SRCS := \
Main.cpp

# include the descriptions for each module
include $(patsubst %, %/module.mk, $(MODULES))

# determine the object files
OBJS := \
$(patsubst %.cpp, %.o, $(filter %.cpp, $(SRCS)))

# link the program
prog: $(OBJS)
$(CC) -o $@ $(OBJS) $(LDFLAGS) $(LIBS)

# include the C include dependencies
include $(OBJS:.o=.d)

# calculate C include dependencies
%.d: %.cpp
depend.sh `dirname $*.cpp` $(CFLAGS) $*.cpp > $@

----------

#!/bin/sh

# Evaluate dependencies for use by the makefile

echo "Called"
DIR="$1"
shift 1
case "$DIR" in
"" | ".")
$CC -MM -MG "$@" | sed -e 's@ˆ\(.*\)\.o:@\1.d \1.o:@' ;;
*)
$CC -MM -MG "$@" | sed -e "s@ˆ\(.*\)\.o:@$DIR/\1.d \ $DIR/\1.o:@" ;;
esac

------------

# module.mk
SRCS += \
Algo.cpp \
CommandHandler.cpp \
Exchange.cpp \
TCPSocket.cpp \
TradingEngine.cpp

----------

$ make
makefile:68: Main.d: No such file or directory
makefile:68: view_string.d: No such file or directory
makefile:68: Algo.d: No such file or directory
makefile:68: CommandHandler.d: No such file or directory
makefile:68: Exchange.d: No such file or directory
makefile:68: TCPSocket.d: No such file or directory
makefile:68: TradingEngine.d: No such file or directory
makefile:68: Exchange.d: No such file or directory
makefile:68: Requests.d: No such file or directory
makefile:68: TickCapture.d: No such file or directory
makefile:68: types.d: No such file or directory
make: *** No rule to make target `types.d'. Stop.

更新完成的 makefile 和示例 module.mk

$cat makefile
# executable name
BINARY := my_prog

# clang config
CLANG := /opt/local/bin/clang++-mp-3.1

CLANG_WARNINGS := \
-Wno-c++98-compat \
-Wno-weak-vtables \
-Wno-padded \
-Wno-global-constructors \
-Wno-exit-time-destructors

CLANG_CFLAGS := \
-g -Weverything -Wall -std=c++11 -stdlib=libc++

CLANG_LDFLAGS := \
-stdlib=libc++

# generic compiler config
CC := $(CLANG)
CFLAGS := $(CLANG_WARNINGS) $(CLANG_CFLAGS)
LDFLAGS := $(CLANG_LDFLAGS)

INCS := \
-I../ \
-I/usr/local/include \
$(patsubst %, -I%, $(SUBDIRS))

LIBS := \
-L/usr/local/boost_1_50_0/stage/lib \
-L/usr/local/lib \
-lboost_program_options \
-lboost_system \
-lglog \
-lpugixml

# list subdirectories in which to look for dependencies
# must define SRCS first as subdirs will append to this
# their src files
SRCS := Main.cpp

SUBDIRS := \
module1 \
module2

include $(patsubst %, %/module.mk, $(SUBDIRS))

# derive object files from srcs
OBJS := $(patsubst %.cpp, %.o, $(filter %.cpp, $(SRCS)))

# link the program
$(BINARY): $(OBJS)
$(CC) -o $@ $(OBJS) $(LDFLAGS) $(LIBS)

# include generated dependency files
DEPS := $(OBJS:.o=.d)
-include $(DEPS)

# generate include dependencies
%.d: %.cpp
./depend.sh `dirname $*.cpp` $(INCS) $*.cpp > $@

# compile
.cpp.o:
$(CC) $(CFLAGS) $(INCS) $< -c -o $@

# clean, obviously
clean:
rm -f $(BINARY)
rm -f $(OBJS)
rm -f $(DEPS)

# et voila!

-----

$cat module1/module.mk
SRCS_PATH := module1
SRCS += \
$(SRCS_PATH)/Algo.cpp \
$(SRCS_PATH)/CommandHandler.cpp \
$(SRCS_PATH)/Exchange.cpp \
$(SRCS_PATH)/TCPSocket.cpp \
$(SRCS_PATH)/TradingEngine.cpp

最佳答案

看起来好像某个模块将 types.cpp 添加到 SRCS,即使不存在这样的源文件。

至于警告,第一次运行这个 makefile 时,依赖文件 (foo.d) 还不存在,所以 Make 提示它不能 include他们。这不是问题,当这些文件事先存在时,警告不会出现在后续运行中。要完全抑制警告,请将 include 更改为 -include

关于c++ - 使用 make 生成依赖项时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12753736/

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