如何将来自不同目录的cpp文件编译到一个文件夹中?

Nik*_*s R 6 c++ windows makefile gnu-make

我有几个C++文件分布在几个文件夹中.

a_library/
    file1.cpp
    file2.cpp
    category1/
        file3.cpp
        file4.cpp
Run Code Online (Sandbox Code Playgroud)

他们被保证具有独特的名称.我想编译所有这些C++文件以分离目录中的Object文件obj/.

我有一个包含相对路径的所有源文件的列表,以及它们对应的目标名称.

a_library/file1.cpp
a_library/file2.cpp
a_library/category1/file3.cpp
a_library/category1/file4.cpp

obj/file1.obj
obj/file2.obj
obj/file3.obj
obj/file4.obj
Run Code Online (Sandbox Code Playgroud)

如何制定将C++文件从第一个列表转换为第二个列表中的对象文件的规则?

这些尝试都不能工作:

obj/%.obj: %:cpp
    # ...

%.obj: %.cpp
    # ...

.cpp.obj:
    # ...
Run Code Online (Sandbox Code Playgroud)

我不想写这样的规则:

obj/%.obj: a_library/%.cpp
    # ...

obj/%.obj: a_library/category1/%.cpp
    # ...
Run Code Online (Sandbox Code Playgroud)

for*_*rk0 5

尝试设置VPATH:

VPATH = a_library:a_library/category1
obj/%.o: %.cpp
    $(CXX) -c $(CPPFLAGS) $(CFLAGS) $(CXXFLAGS) -o $@ $<
Run Code Online (Sandbox Code Playgroud)

并添加完整的文件列表(我建议您明确列出文件,不要使用$(wildcard ...)函数)和链接应用程序:

files := main.cpp $(wildcard a_library/*.cpp) a_library/category1/file.cpp

obj/application: $(patsubst %.cpp,obj/%.o,$(notdir $(files)))
    $(CXX) $(CFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ $+
Run Code Online (Sandbox Code Playgroud)

$(wildcard)有一个恼人的趋势拿起任何东西的目录,如一次性的测试文件或临时对象(如果他们碰巧有一个合适的名字:~file.cpp).