C++ 我可以编译src/to.o'中的所有.cpp文件吗;s在obj/中,然后链接到二进制在。/?
我的项目目录如下所示:C++ 我可以编译src/to.o'中的所有.cpp文件吗;s在obj/中,然后链接到二进制在。/?,c++,build-process,makefile,C++,Build Process,Makefile,我的项目目录如下所示: /project Makefile main /src main.cpp foo.cpp foo.h bar.cpp bar.h /obj main.o foo.o bar.o 我想让我的makefile做的是将/src文件夹中的所有.cpp文件编译到/obj文件夹中的.o文件,然后将/obj中的所有.o文件链接
/project
Makefile
main
/src
main.cpp
foo.cpp
foo.h
bar.cpp
bar.h
/obj
main.o
foo.o
bar.o
我想让我的makefile做的是将/src
文件夹中的所有.cpp
文件编译到/obj
文件夹中的.o
文件,然后将/obj
中的所有.o
文件链接到顶级文件夹/project
中的输出二进制文件中
我几乎没有使用Makefiles的经验,也不确定要搜索什么来实现这一点
此外,这是一种“好”的方法,还是有一种更标准的方法来实现我的目标?问题的一部分是生成文件 这很容易,除非你不需要概括 尝试下面的代码(但将空格缩进替换为g++附近的制表符)
SRC_DIR:=…/SRC
对象目录:=…/OBJ
SRC_文件:=$(通配符$(SRC_DIR)/*.cpp)
OBJ_文件:=$(patsubst$(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRC_文件))
LDFLAGS:=。。。
CPPFLAGS:=。。。
CXXFLAGS:=。。。
main.exe:$(OBJ_文件)
g++$(LDFLAGS)-o$@$^
$(OBJ_DIR)/%.o:$(SRC_DIR)/%.cpp
g++$(CPPFLAGS)$(CXXFLAGS)-c-o$@$<
自动依赖关系图生成 大多数make系统的“必备”功能。通过将
-MMD
标志添加到cxflags
和-include$(OBJ_FILES:.o=.d)
添加到makefile主体的末尾,可以一次性完成GCC-in编译,作为编译的副作用:
cxflags+=-MMD
-包括$(对象文件:.o=.d)
正如大家已经提到的,它非常有用。通配符也适用于我,但我想给那些使用目录变量的人一个小提示。始终对文件夹树使用斜杠(而不是反斜杠),否则将失败:
BASEDIR = ../..
SRCDIR = $(BASEDIR)/src
INSTALLDIR = $(BASEDIR)/lib
MODULES = $(wildcard $(SRCDIR)/*.cpp)
OBJS = $(wildcard *.o)
,示例:@aaa:我猜OP需要一个不需要明确列出每个源文件的解决方案。我不想指定我拥有的每个源文件,我以前也试过阅读该手册,但我发现它杂乱无章,难以理解。我从一个实际的例子中学到的东西比枯燥的技术手册要好得多,这个例子做了我所期望的,并且解释得很好。但是make文档非常优秀,有很好的示例(不是try技术手册)。您正在寻找模式规则:这看起来更像我想要的。不过,恕我直言,make手册有点枯燥,因为它似乎更适合处于make中级的开发人员,除此之外,它还非常庞大和深入。也许太过分了。啊,你几秒钟就赢了我。但是我建议
OBJ_FILES=$(patsubst src/%.cpp,OBJ/%.o,$(cpp_FILES))
。为了让它正常工作,我不得不改变这一点:$@bobah您缺少一个'。”在cpp的对象规则中,特殊变量可能值得解释,因为它们是特定于文件的,很难搜索:我知道这是一个老问题,但是我根据我的项目做了一些修改,但它不起作用。这是我的makefile:I进入控制台:make:**“bin/main”不需要规则来生成目标“/main.o”。Pare.
你是说正斜杠吗?您的示例显示了传统上被认为是正斜杠的内容。具体来说,“向右倾斜”的被认为是“向前”的,而左边的被认为是“向后”的是的,你是对的,我的意思是“斜线”。我更新了帖子。