gpt4 book ai didi

c++ - "Recursive Makefile Considered Harmful"样式 makefile 问题

转载 作者:行者123 更新时间:2023-11-28 02:56:45 29 4
gpt4 key购买 nike

我在使用受 Recursive Makefile Considered Harmful 启发的 makefile 来构建我的程序时遇到了一些麻烦。纸。

我是 makefile 的新手,我能够很好地构建它,但是有一些东西不起作用,根据我的理解,应该是在职的。我希望你们能够为我澄清这些事情!

我正在运行 OSX。使用 g++ 编译(或至少,打算)。这是相关的 makefiledepend.sh

生成文件

CC = g++
MODULES := src Engine Engine/core Engine/render
# look for include files in
# each of the modules
CFLAGS := $(patsubst %,-I%,$(MODULES)) -I/usr/local/include/SDL2/
# extra libraries if required
LIBS := -lm -L/usr/local/lib/ -lSDL2 -lSDL2main -lSDL2_image
# each module will add to this
SRC :=
# include the description for
# each module
include $(patsubst %,%/module.mk,$(MODULES))
# determine the object files
OBJ := $(patsubst %.cpp,%.o, $(filter %.cpp,$(SRC))) #\
#$(patsubst %.y,%.o, \
#$(filter %.y,$(SRC)))
# link the program
main: $(OBJ)
$(CC) -o $@ $(OBJ) $(LIBS) $(CFLAGS)
# include the C++ include
# dependencies
include $(OBJ:.o=.d)
# calculate C++ include
# dependencies
%.d: %.cpp
./depend.sh ‘dirname $*.cpp‘ $(CFLAGS) $*.cpp > $@

clean:
find ./ -iname "*.o" -exec rm {} \;
find ./ -iname "*.d" -exec rm {} \;
rm main

依赖.sh

#!/bin/sh
DIR="$1"
shift 1
case "$DIR" in
"" | ".")
g++ -MM -MG "$@" |
sed -e ’s@ˆ\(.*\)\.o:@\1.d \1.o:@’
;;
*)
g++ -MM -MG "$@" |
sed -e "s@ˆ\(.*\)\.o:@$DIR/\1.d $DIR/\1.o:@"
;;
esac

<强>1。包含目录

我在我的应用程序中使用 SDL2 来处理窗口和其他媒体功能。我的 SDL2 include 目录安装在 /usr/local/include/SDL2/。所以在我的 CFLAGS 中我有 -I/usr/local/include/SDL2/。在以前的非常简单的 makefile 中,这是可行的。 SDL 目录已包含在内,我的包含 SDL header 的代码文件按预期工作。但是使用上面的 makefile,SDL 包含目录似乎被完全忽略了!我需要在我的代码文件中使用绝对路径来包含 SDL(即忽略包含目录,对吗?)。

我的工作是在我的工作目录中创建一个符号链接(symbolic link)并使用相对路径来访问它,但这远非理想......知道我在这里可能做错了什么吗?我从根本上误解了什么吗?

<强>2。模块

在这一点上,我似乎需要更新顶级 MODULES 变量以包含我项目中的几乎所有文件夹。我试图将子文件夹附加到相应的 module.mk 文件,但这没有效果。例如。我还从顶级 makefile 中删除了 Engine/coreEngine/render 模块,然后在 module.mk 文件在 Engine 文件夹中找到,我有:

MODULES += Engine/core Engine/render

我的想法是顶层makefile会看到有一个Engine模块,它会检查Engine文件夹,打开打开 module.mk 文件,看到还有 2 个模块。这是不正确的吗?

一个奇怪的观察

在我的makefile 中,我将CC 定义为g++。然后,我在 main 目标中使用 $(CC)。我还在 depend.sh 中指定了 g++。然而,当我成功构建时,我得到了一堆这样的错误:

./depend.sh ‘dirname src/main.cpp‘ -Isrc -IJEngine -IEngine/core -IEngine/render -I/usr/local/include/SDL2/ src/main.cpp > src/main.d
clang: error: no such file or directory: 'src/main.cpp‘'

紧随其后的是成功:

c++    -c -o src/main.o src/main.cpp
c++ -c -o Engine/Engine.o Engine/Engine.cpp
c++ -c -o Engine/core/Error.o Engine/core/Error.cpp
c++ -c -o Engine/core/Window.o Engine/core/Window.cpp
c++ -c -o Engine/render/Render.o Engine/render/Render.cpp
g++ -o main src/main.o Engine/Engine.o Engine/core/Error.o Engine/core/Window.o Engine/render/Render.o -lm -L/usr/local/lib/ -lSDL2 -lSDL2main -lSDL2_image -Isrc -IEngine -IEngine/core -IEngine/render -I/usr/local/include/SDL2/

耶!它建成了!它运行!但是这些错误是什么?为什么 c++ 用于除最后一次调用之外的所有内容,而不是 g++?我没有在任何地方指定 c++(我想!)

任何帮助将不胜感激!如果我遗漏了任何必要的信息,请告诉我。

最佳答案

CC 变量指的是 c 编译器而不是 C++ 编译器。对于 cpp 文件,make 将使用默认为 c++CXX 的值。这就是您在输出中看到 c++ 的原因。 CC 也用于链接,这就是为什么您会在输出的最后一行看到 CC 的值。

如果您想对 cpp 文件使用 g++(假设您这样做?),请设置 CXX 而不是(或添加到)CC

您可以在没有 makefile 的目录中运行 make -p 来查看所有隐式规则和变量。

我相信 depend.shdirname 参数应该没有引号。你想把目录传进去。

更新:我应该注意到 CFLAGS 由隐式 .c 文件配方使用,但不用于 .cpp 文件配方。所以你的 CFLAGS -I 在编译你的 cpp 文件时被忽略了。您需要改为设置 CXXFLAGS。

关于c++ - "Recursive Makefile Considered Harmful"样式 makefile 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21805880/

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