从 file.cpp 映射到 file.o cmake
Mapping from file.cpp to file.o cmake
我有一个示例 .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
。现在,在我的 .mk
文件中手动添加相应的 file1.o
: file99.o
和 file1.d
: file99.d
是没有意义的。
我的问题: 是否有更智能的方式将 .cpp
文件映射到 .d
和 .o
?
对于 .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)))
我有一个示例 .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
。现在,在我的 .mk
文件中手动添加相应的 file1.o
: file99.o
和 file1.d
: file99.d
是没有意义的。
我的问题: 是否有更智能的方式将 .cpp
文件映射到 .d
和 .o
?
对于 .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)))