【问题标题】:[MAKEFILE]: How to copy cpp source files from different source folders into one destination folder and use those cpp files to build using MAKE[MAKEFILE]:如何将 cpp 源文件从不同的源文件夹复制到一个目标文件夹并使用这些 cpp 文件使用 MAKE 构建
【发布时间】:2020-08-22 21:19:33
【问题描述】:

我当前的 makefile 如下所示,它正确地构建了目标。但它无法在一个实例中构建目标,即源文件的路径长度变得太长。因此,我想将不同文件夹中的所有源文件收集到一个源目录中,然后进行制作。

关于如何修改以下 makefile 以创建平面源目录并使用该目录中的文件通过 make 构建的任何线索

PROJ_DIR := ../
SRC_DIR += $(PROJ_DIR)project
SRC_FILES += $(wildcard $(SRC_DIR)/*/source/*.cpp)
OBJ_DIR := $(PROJ_DIR)TASK
OBJ_FILES += $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRC_FILES))

CXXFLAGS := --c++14

CC_INCLUDE_PATH += -I$(PROJ_DIR)project/include

.PHONY: all clean dirs

all: $(OBJ_DIR) $(OBJ_FILES) 
    "$(COMPILERBIN)"/cc.exe -rvn crackLib.a $(OBJ_FILES)

clean:
    @rm -rf crackLib.a $(OBJ_DIR) $(FLAT_INC_DIR)  

# Build target for directory creation. Intermediate build files will be placed here.
$(OBJ_DIR):
    mkdir -p $@

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp 
    "$(COMPILERBIN)"/cc.exe $(CXXFLAGS) -c -o $@ $< $(CC_INCLUDE_PATH) 

$(OBJ_DIR)/%.o: $(TSM_SRC_DIR)/%.cpp
    "$(COMPILERBIN)"/cc.exe $(CXXFLAGS) -c -o $@ $< $(CC_INCLUDE_PATH) 

$(OBJ_DIR)/%.o: $(SL_SRC_DIR)/%.cpp
    "$(COMPILERBIN)"/cc.exe $(CXXFLAGS) -c -o $@ $< $(CC_INCLUDE_PATH) 

-include $(OBJ_FILES:.o=.d)

【问题讨论】:

  • 你说源文件路径太长会失败。 Make命令编译器在不存在的目录(../TASK/longpath/source/)中构建目标文件(foo.o)的问题?
  • 是的,因为 ./TASK/longpath/source/ 太长,编译器似乎认为该文件不存在。但实际上源文件确实存在。

标签: c++ gcc makefile gnu-make


【解决方案1】:

假设我们有源文件$(SRC_DIR)/longpath/source/foo.cpp,并且我们想要构建目标文件$(OBJ_DIR)/foo.o。我们可能希望这条规则:

$(OBJ_DIR)/foo.o: $(SRC_DIR)/longpath/source/foo.cpp
    ... $< -o $@

但是我们在编写makefile的时候不知道路径,所以我们必须在构建的时候让Make自己弄清楚。

有不止一种方法可以做到这一点。最简单的就是使用the vpath directive

如果我们提前确定路径,我们可以这样写:

vpath %.cpp $(SRC_DIR)/longpath/source

$(OBJ_DIR)/foo.o: foo.cpp
    ... $< -o $@

Make 将使用vpath 搜索源文件,并使用其完整路径作为先决条件(因此使用$&lt;)。

vpath 指令可以采用多个目录,虽然我们事先不知道路径,但我们知道如何计算它们:

vpath %.cpp $(dir $(SRC_FILES))

$(OBJ_DIR)/foo.o: foo.cpp
    ... $< -o $@

一旦我们确认这可行,我们就可以切换到模式规则:

$(OBJ_DIR)/%.o: %.cpp
    ... $< -o $@

并相应地更改OBJ_FILES

OBJ_FILES += $(patsubst %.cpp,$(OBJ_DIR)/%.o,$(notdir $(SRC_FILES)))

all: $(OBJ_FILES)
    ... $^

【讨论】:

    猜你喜欢
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多