【问题标题】:Mapping from file.cpp to file.o cmake从 file.cpp 映射到 file.o cmake
【发布时间】:2018-12-25 09:58:26
【问题描述】:

我有一个这样的.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.ofile1.d : file99.d 是没有意义的。

我的问题:有没有更聪明的方法将.cpp 文件映射到.d.o

【问题讨论】:

  • $(patsubst %.cpp, %.o, $(CPP_SRCS))
  • 如果.cpp.o 有不同的路径怎么办。在这种情况下,我需要将 %.cpp 映射到 %.o .. 你有什么想法吗?
  • 好的,我有个主意,我会写完整的答案
  • $(addprefix my_new_dir/, $(notdir $(CPP_SRCS:.cpp=.o)))
  • 添加到你自己的

标签: c++ regex makefile wildcard


【解决方案1】:

对于.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)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多