2011-05-31 57 views
1

是否有一种干净/便携的方式从给定的目录递归下降,将所有找到的.cpp文件编译成单个输出文件?我不确定makefile是否有这种功能,或者它是某种构建脚本的工作,但我想避免将各种IDE的项目文件与我的代码一起保存。Portably编译整个目录

+0

我的投票是先通过一个脚本将所有'.cpp'组装到列表中,然后将该列表作为输入提供给您最喜欢的编译器。由于我不知道可以跨越平台的脚本,所以我会将其保留为commet。 :) – Xeo 2011-05-31 18:23:51

+0

@Xeo至少这样我只需要为每个平台编写脚本一次。 – Maxpm 2011-05-31 18:25:11

+0

@Xeo:您​​可以直接在makefile中执行此操作 - 请参阅下面的答案。 – 2011-05-31 18:29:15

回答

2

你可以在这里做不同的事情。我建议你使用多平台构建系统,并按照它的文档。我过去使用过CMake,但我不知道如何告诉它在目录中编译所有文件。

其优点是用户可以使用CMake生成大多数常用IDE的项目文件,因此它可以让VisualStudio用户生成VS解决方案,MacOSX用户生成Xcode项目,Eclipse CDK项目几乎适用于任何环境,Makefiles ...

2

还有可以用来匹配像这样的图案wildcard function

CXX_FILES = $(wildcard src/*.cpp) # All .cpp files in the directory 

这不是递归,但至少可以使你免于在某个目录手动指定文件。建立他们会看起来像这样的规则:

CXX_FILES = $(wildcard src/*.cpp) # All .cpp files in the directory 
OBJ_FILES = $(CXX_FILES:src/%.cpp=$(OBJ_DIR)/%.o) # Corresponding .o files 

# Rules 
all: $(OBJ_FILES) 
    g++ $(OBJ_FILES) -o output_filename 

$(OBJ_DIR)/%.o: src/%.cpp 
    g++ -c $< -o [email protected] 

哦,回答你的问题,这种方法是完全可移植的。

+0

如果它是*完全可移植的*,这是否意味着它也在CP/M上运行?由于该操作系统没有*目录*的概念。而如果你有一个没有GNU Make的平台,你显然依赖它?或者没有安装GCC的系统? – 2011-05-31 18:33:12

+0

+1,因为它回答了问题。不过,我会推荐使用更新的工具,比如'SConstruct'。在这种情况下,增益可能并不明显,但如果您突然需要编译除*之外的所有'.cpp' **,那么您拥有python的所有功能来帮助您:) – ereOn 2011-05-31 18:35:37

+1

-1因为它没有'完全回答这个问题。 – 2011-05-31 18:37:57