Отображение из file.cpp в file.o cmake - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть образец .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.o: file99.o и file1.d: file99.d в мой файл .mk.

Мой вопрос: Есть ли более умный способ сопоставления .cpp файлов с .d и .o?

1 Ответ

0 голосов
/ 25 декабря 2018

Для .cpp списка файлов должно работать следующее:

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

В соответствии с комментарием liliscent , следующее должно выполнить работу для .o и .dfiles:

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