c++ 是否有方法可以忽略未使用的源文件?

uajslkp6  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(282)

我有下面的项目结构。

  1. [22:58:45] BasicProject$ tree -l
  2. .
  3. ├── Makefile
  4. └── SourceCode
  5. ├── Controllers
  6. ├── MenuPage.cpp
  7. ├── MenuPage.hpp
  8. └── Unused.cpp
  9. ├── main.cpp
  10. ├── main.hpp
  11. └── Visuals -> ../AnotherProject/SourceCode/Visuals
  12. ├── Components
  13. └── Text.hpp
  14. ├── MenuPage.cpp
  15. └── MenuPage.hpp

BasicProject/SourceCode/Controllers文件夹中,有一个名为Unused.cpp的未使用的源文件。其他源文件都没有引用过。有没有一种方法可以从编译过程中排除这样的文件?未使用的文件根据一组编译参数(例如目标体系结构、库选择等)而改变。
我使用以下简化的Makefile来构建我的项目。

  1. PRJ_NAME := BasicProject
  2. ### Paths ###
  3. PRJ_ROOT := ./
  4. PRJ_SOURCE_CODE := ${PRJ_ROOT}/SourceCode
  5. PRJ_OUTPUT_DIR := ${PRJ_ROOT}/Outputs
  6. PRJ_OBJECTS_DIR := ${PRJ_OUTPUT_DIR}/Objects
  7. INCLUDES += -I${PRJ_SOURCE_CODE}
  8. ### Derived Variables ###
  9. CPP_SRC_FILES := $(shell find -L $(PRJ_SOURCE_CODE) -type f -name "*.cpp" -print)
  10. CPP_OBJECTS := $(patsubst $(PRJ_SOURCE_CODE)/%.cpp,$(PRJ_OBJECTS_DIR)/%.o, $(CPP_SRC_FILES))
  11. ### Targets ###
  12. all: $(CPP_OBJECTS)
  13. @g++ -o ${PRJ_OUTPUT_DIR}/${PRJ_NAME}.elf $(CPP_OBJECTS)
  14. clean:
  15. rm -rf ${PRJ_OBJECTS_DIR}
  16. ${PRJ_OBJECTS_DIR}/%.o : $(PRJ_SOURCE_CODE)/%.cpp
  17. @mkdir -p $(@D)
  18. @g++ $(INCLUDES) -c $< -o $@
cyej8jka

cyej8jka1#

您可以在Makefile中从编译过程中排除特定的文件。要从编译中排除“Unused.cpp”文件,可以按如下方式修改Makefile:

  1. PRJ_NAME := BasicProject
  2. ### Paths ###
  3. PRJ_ROOT := ./
  4. PRJ_SOURCE_CODE := ${PRJ_ROOT}/SourceCode
  5. PRJ_OUTPUT_DIR := ${PRJ_ROOT}/Outputs
  6. PRJ_OBJECTS_DIR := ${PRJ_OUTPUT_DIR}/Objects
  7. INCLUDES += -I${PRJ_SOURCE_CODE}
  8. ### Derived Variables ###
  9. CPP_SRC_FILES := $(shell find -L $(PRJ_SOURCE_CODE) -type f -name "*.cpp" -not -name "Unused.cpp" -print)
  10. CPP_OBJECTS := $(patsubst $(PRJ_SOURCE_CODE)/%.cpp,$(PRJ_OBJECTS_DIR)/%.o, $(CPP_SRC_FILES))
  11. ### Targets ###
  12. all: $(CPP_OBJECTS)
  13. @g++ -o ${PRJ_OUTPUT_DIR}/${PRJ_NAME}.elf $(CPP_OBJECTS)
  14. clean:
  15. rm -rf ${PRJ_OBJECTS_DIR}
  16. ${PRJ_OBJECTS_DIR}/%.o : $(PRJ_SOURCE_CODE)/%.cpp
  17. @mkdir -p $(@D)
  18. @g++ $(INCLUDES) -c $< -o $@

通过修改CPP_SRC_FILES行,我们使用带有-not -name“Unused.cpp”选项的find命令,从要编译的源文件列表中排除“Unused.cpp”文件。
现在,当您运行make all时,“Unused.cpp”文件将从编译过程中排除,并且生成的二进制文件将不包含它。
如果你喜欢这个答案,请投赞成票。Happy coding:)

展开查看全部
fhg3lkii

fhg3lkii2#

简短的回答是,没有自动化的方法来忽略“未使用的”源文件。构建系统如何了解哪些源文件被使用,哪些没有?如果你能提供一个算法来做出这个决定(这并不涉及实际编译所有文件来查看是否需要其中的任何符号!)那么也许我们可以提出一种实现该算法的方法。
如果没有,您将不得不硬编码未使用的文件列表。你可以这样做:

  1. UNUSED := $(PRJ_SOURCE_CODE)/UnusedOne.cpp $(PRJ_SOURCE_CODE)/UnusedTwo.cpp
  2. ALL_SRC_FILES := $(shell find -L $(PRJ_SOURCE_CODE) -type f -name "*.cpp" -print)
  3. CPP_SRC_FILES := $(filter-out $(UNUSED),$(ALL_SRC_FILES)

在你的问题中,你说有多个架构有不同的要求,但在你的示例makefile中没有指示为多个架构构建或选择标志,所以我们没有办法向你展示如何集成。但是你可以使用构造变量名;例如,如果你有一个变量ARCH,它包含要构建的架构,你可以有这样的内容:

  1. ARCH := x86
  2. x86_UNUSED := $(PRJ_SOURCE_CODE)/This_arm64.cpp
  3. arm64_UNUSED := $(PRJ_SOURCE_CODE)/That_x86.cpp
  4. ALL_SRC_FILES := $(shell find -L $(PRJ_SOURCE_CODE) -type f -name "*.cpp" -print)
  5. CPP_SRC_FILES := $(filter-out $($(ARCH)_UNUSED),$(ALL_SRC_FILES)

相关问题