我有下面的项目结构。
[22:58:45] BasicProject$ tree -l
.
├── Makefile
└── SourceCode
├── Controllers
│ ├── MenuPage.cpp
│ ├── MenuPage.hpp
│ └── Unused.cpp
├── main.cpp
├── main.hpp
└── Visuals -> ../AnotherProject/SourceCode/Visuals
├── Components
│ └── Text.hpp
├── MenuPage.cpp
└── MenuPage.hpp
在BasicProject/SourceCode/Controllers
文件夹中,有一个名为Unused.cpp
的未使用的源文件。其他源文件都没有引用过。有没有一种方法可以从编译过程中排除这样的文件?未使用的文件根据一组编译参数(例如目标体系结构、库选择等)而改变。
我使用以下简化的Makefile来构建我的项目。
PRJ_NAME := BasicProject
### Paths ###
PRJ_ROOT := ./
PRJ_SOURCE_CODE := ${PRJ_ROOT}/SourceCode
PRJ_OUTPUT_DIR := ${PRJ_ROOT}/Outputs
PRJ_OBJECTS_DIR := ${PRJ_OUTPUT_DIR}/Objects
INCLUDES += -I${PRJ_SOURCE_CODE}
### Derived Variables ###
CPP_SRC_FILES := $(shell find -L $(PRJ_SOURCE_CODE) -type f -name "*.cpp" -print)
CPP_OBJECTS := $(patsubst $(PRJ_SOURCE_CODE)/%.cpp,$(PRJ_OBJECTS_DIR)/%.o, $(CPP_SRC_FILES))
### Targets ###
all: $(CPP_OBJECTS)
@g++ -o ${PRJ_OUTPUT_DIR}/${PRJ_NAME}.elf $(CPP_OBJECTS)
clean:
rm -rf ${PRJ_OBJECTS_DIR}
${PRJ_OBJECTS_DIR}/%.o : $(PRJ_SOURCE_CODE)/%.cpp
@mkdir -p $(@D)
@g++ $(INCLUDES) -c $< -o $@
2条答案
按热度按时间cyej8jka1#
您可以在Makefile中从编译过程中排除特定的文件。要从编译中排除“Unused.cpp”文件,可以按如下方式修改Makefile:
通过修改CPP_SRC_FILES行,我们使用带有-not -name“Unused.cpp”选项的find命令,从要编译的源文件列表中排除“Unused.cpp”文件。
现在,当您运行make all时,“Unused.cpp”文件将从编译过程中排除,并且生成的二进制文件将不包含它。
如果你喜欢这个答案,请投赞成票。Happy coding:)
fhg3lkii2#
简短的回答是,没有自动化的方法来忽略“未使用的”源文件。构建系统如何了解哪些源文件被使用,哪些没有?如果你能提供一个算法来做出这个决定(这并不涉及实际编译所有文件来查看是否需要其中的任何符号!)那么也许我们可以提出一种实现该算法的方法。
如果没有,您将不得不硬编码未使用的文件列表。你可以这样做:
在你的问题中,你说有多个架构有不同的要求,但在你的示例makefile中没有指示为多个架构构建或选择标志,所以我们没有办法向你展示如何集成。但是你可以使用构造变量名;例如,如果你有一个变量
ARCH
,它包含要构建的架构,你可以有这样的内容: