Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以编译src/to.o'中的所有.cpp文件吗;s在obj/中,然后链接到二进制在。/?_C++_Build Process_Makefile - Fatal编程技术网

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.
你是说正斜杠吗?您的示例显示了传统上被认为是正斜杠的内容。具体来说,“向右倾斜”的被认为是“向前”的,而左边的被认为是“向后”的是的,你是对的,我的意思是“斜线”。我更新了帖子。