如何将从源目录到对象的所有cpp文件编译到单独的构建目录
How to compile all cpp files from source directories to object into a separate build directory
我的问题是问题的扩展,我可以编译src/中的所有.cpp文件到obj/中的.o's,然后链接到。/中的二进制文件吗?
我的项目有类似的结构,但我有不止一个src文件夹,包括文件夹,在我的根/项目目录之外:
/somedir
/project
Makefile
main
/src1
main.cpp
foo.cpp
foo.h
/src2
bar.cpp
bar.h
...
/srcn
baz.cpp
baz.cpp
/obj
main.o
foo.o
bar.o
...
baz.o
alpha.o
betta.o
...
zetta.o
/ext_src1
alpha.cpp
/ext_src2
betta.cpp
...
/ext_srcn
zetta.cpp
在我的Makefile中,我有我需要的所有cpp的列表,部分手动收集,部分使用通配符。我假设所有cpp文件的名称都是不同的(并且它们的对象可以安全地放在一个目录中)。现在,我如何将它们全部编译到obj文件夹中呢?
我设法用下列方法几乎做了我想做的事:
SOURCES=${wildcard src1/*.cpp}
SOURCES+=${wildcard src2/*.cpp}
...
SOURCES+=../ext_srcn/zetta.cpp
OBJECTS=$(SOURCES:.cpp=.o)
main: $(OBJECTS)
$(CC) $(LD_FLAGS) -o $@ $^
.cpp.o:
$(CC) $(CFLAGS) -c $< $(INCLUDES) -o $(addprefix obj/,$(notdir $@))
但是现在,当然,所有的源代码每次都要重新编译,即使没有做任何更改。这太可怕了。我如何在对象j上追踪我的。o目标的起源?或者可能有其他方法来解决我的任务?
可以将源路径保留在obj
目录下:
TOP := $(realpath ../)
SOURCES := $(wildcard $(TOP)/project/src1/*.cpp)
SOURCES += $(wildcard $(TOP)/project/src2/*.cpp)
...
SOURCES += $(TOP)/ext_srcn/zetta.cpp
OBJECTS := $(addprefix $(TOP)/project/obj,$(patsubst $(TOP),,$(SOURCES:%.cpp=%.o)))
main: $(OBJECTS)
$(CC) $(LD_FLAGS) -o $@ $^
$(OBJECTS): $(TOP)/project/obj/%.o: $(TOP)/%.cpp
$(CC) $(CFLAGS) -c $< $(INCLUDES) -o $@
这样你就会得到这样的内容:
/somedir
/project
Makefile
main.cpp
/src1
foo.cpp
foo.h
/src2
bar.cpp
bar.h
...
/srcn
baz.cpp
baz.h
/obj
/project
main.o
/src1
foo.o
/src2
baz.o
...
/srcn
baz.o
/ext_src1
alpha.o
/ext_src2
beta.o
...
/ext_srcn
zetta.o
/ext_src1
alpha.cpp
/ext_src2
betta.cpp
...
/ext_srcn
zetta.cpp
并且,- 通常 -依赖项会工作得很好。
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 如何在cpp文件之间切换窗口?在Qt中
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我有两个类需要在同一 cpp 文件中相互引用,但第一个类无法识别第二个类类型的对象
- .h 和.cpp文件分离时出错,但仅使用 .h 文件时没有错误.我做错了什么?
- 库标题在标题中不可见,但在 cmake build 下.cpp文件中完全可见.为什么?
- C++ 链接到单独的.cpp文件说"multiple definitions"
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 如何使用 samtools C API 构建一个简单的主.cpp文件
- 包含在.cpp文件中包含在 .h 文件时包含
- C++(.cpp文件和.h文件)拆分代码并添加一个函数,提取 - 这很容易吗?
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 如何使用线程类编译 cpp 文件?
- 使用 Powershell 命令将 cpp 文件的文件夹编译为 GNU 的 g++
- 我应该将外部标头放在 .h 文件还是.cpp文件中?
- 从另一个 cpp 文件更改结构内、映射键内的变量