繁体   English   中英

从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.cppfile99.cpp 现在,在我的.mk文件中手动添加相应的file1.ofile99.ofile1.dfile99.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)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM