从file.cpp映射到file.o cmake

时间:2018-12-25 09:58:26

标签: c++ regex makefile wildcard

我有一个示例String文件,如下所示:

.mk

假设我有许多文件,例如CPP_SRCS += \ <FILE_PATH_HERE>/file1.cpp \ <FILE_PATH_HERE>/file2.cpp OBJS += \ <FILE_PATH_HERE>/file1.o \ <FILE_PATH_HERE>/file2.o CPP_DEPS += \ <FILE_PATH_HERE>/file1.d \ <FILE_PATH_HERE>/file2.d <FILE_PATH_HERE>/%.o: <FILE_PATH_HERE>/%.cpp @echo 'Building file: $<' @echo 'Invoking: Cross G++ Compiler' g++ -std=c++11 -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<" @echo 'Finished building: $<' @echo ' ' file1.cpp。现在,在我的file99.cpp文件中手动添加相应的file1.ofile99.ofile1.dfile99.d没有意义。

我的问题:是否有一种更智能的方式将.mk文件映射到.cpp.d

1 个答案:

答案 0 :(得分:0)

对于.cpp文件列表,以下方法应该起作用:

CPP_SRCS := \
$(wildcard <CPP_FILES_PATH_HERE>/*.cpp)

根据liliscent的注释,以下应该对.o.d文件进行处理:

OBJS := \
$(patsubst %.cpp, %.o, $(CPP_SRCS))

CPP_DEPS := \
$(patsubst %.cpp, %.d, $(CPP_SRCS))

但是,只要您希望.cpp.o.d文件位于同一目录中,此方法就起作用。如果它们应该具有不同的目录,则有两种解决方案:

第一个解决方案:

.cpp.o.d文件的路径具有公共前缀时,我建议使用此解决方案:

OBJS := \
$(subst <CPP_FILES_PATH_HERE>,<O_FILES_PATH_HERE>, $(patsubst %.cpp, %.o, $(CPP_SRCS)))

CPP_DEPS := \
$(subst <CPP_FILES_PATH_HERE>,<D_FILES_PATH_HERE>, $(patsubst %.cpp, %.d, $(CPP_SRCS)))

第二个解决方案:

.cpp.o.d文件的路径完全不同时,我建议使用此解决方案:

OBJS := \
$(addprefix <O_FILES_PATH_HERE>, $(notdir $(CPP_SRCS:.cpp=.o)))

CPP_DEPS := \
$(addprefix <D_FILES_PATH_HERE>, $(notdir $(CPP_SRCS:.cpp=.d)))