如何使用g++编译指定目录下除特定.cpp文件外的所有源文件
编译指定目录下所有C++文件但排除特定文件的几种方法
嗨,这个需求其实挺常见的,我给你分享几个在不同场景下好用的解决方案:
方法一:Bash扩展匹配(简单直接,适合临时使用)
如果你用的是Bash shell,可以先开启扩展通配符模式,然后用排除语法来指定文件:
# 开启Bash扩展匹配(如果没开启的话) shopt -s extglob # 编译除了main.cpp之外的所有.cpp文件 g++ -std=c++17 ../src/!(main.cpp) -o ../out/a.out
要是想一次性执行,也可以把两个命令放同一行:
shopt -s extglob && g++ -std=c++17 ../src/!(main.cpp) -o ../out/a.out
注意:这个方法只在Bash下有效,Zsh用户可以开启extendedglob选项后用../src/^main.cpp来实现类似效果。
方法二:Find命令(跨Shell通用,适合复杂场景)
如果需要兼容更多shell环境,或者文件名里有空格、特殊字符,用find命令会更稳妥:
find ../src -maxdepth 1 -name "*.cpp" ! -name "main.cpp" -exec g++ -std=c++17 {} + -o ../out/a.out
参数解释:
-maxdepth 1:只查找当前指定目录(不递归子文件夹),如果需要递归的话去掉这个参数-name "*.cpp":筛选所有.cpp文件! -name "main.cpp":排除名为main.cpp的文件-exec ... {} +:把找到的所有文件批量传给g++,避免文件名特殊字符导致的问题
方法三:Makefile(适合长期维护的项目)
如果是频繁编译的项目,写个简单的Makefile会更方便,以后修改排除规则或者编译参数都更省心:
# 指定编译器和编译参数 CXX = g++ CXXFLAGS = -std=c++17 # 定义目录和目标文件路径 SRC_DIR = ../src OUT_DIR = ../out TARGET = $(OUT_DIR)/a.out # 自动查找所有.cpp文件,然后排除main.cpp SOURCES = $(filter-out $(SRC_DIR)/main.cpp, $(wildcard $(SRC_DIR)/*.cpp)) # 默认目标:编译生成可执行文件 all: $(TARGET) # 编译规则:用所有指定的源文件生成目标文件 $(TARGET): $(SOURCES) $(CXX) $(CXXFLAGS) $^ -o $@
写完之后,只需要在终端执行make命令就能自动完成编译了。
内容的提问来源于stack exchange,提问作者K. Claesson
相关产品推荐
相关产品推荐

