如何为许多自包含cpp文件的文件夹制作* / *?

时间:2012-11-29 07:16:52

标签: c++ opencv makefile

我在玩this OpenCV 2 Cookbook的一些教程代码。该代码不附带任何Makefile,我想创建一个Makefile,可以使代码库中的所有文件。我的计划是使用性能分析编译所有文件,然后创建一个运行所有可执行文件的脚本并收集gprof结果。然后,我可以对各种OpenCV函数的计算时间有所了解。

代码库的排列方式如下:tutorial_code/Chapter[1-10]/*.cpp 每个.cpp文件都是自给自足的,可以在不与此代码库中的其他模块链接的情况下进行编译。 (但是,有一些小的头文件库。)

以下是我坚持的几件事:

  • 通常,Makefile中的$(EXEC)表示一个文件,它是大部分构建工作的顶点。但是,就我而言,我想为每个$(EXEC)文件创建一个单独的.cpp。我认为我已接近正确,但到目前为止我的Makefile只生成*.o但不生成*.out
  • 我知道SOURCES = $(wildcard *.cpp)是一种“收集”当前目录中的cpp文件集的方法。 SOURCES = $(wildcard */*.cpp)将向下钻取并获取子目录中的所有.cpp文件是有意义的。但它似乎没有用。

this tutorial开始,我设置了一个实现建议功能的Makefile。它不太有效... $(wildcard */*.cpp)似乎没有深入到目录,我不知道如何做$<$@之类的事情来引用{ {1}}并创建basefilename.o

basefilename.out

  • 我对Makefiles和OpenCV非常熟悉,并且通过手工编写Makefile中的依赖项,对象等列表来编译我自己的项目没有问题。然而,对于手头的问题,只需自动制作所有内容而无需太多用户干预就很棒。
  • 随意发表评论,发送电子邮件或给我发消息,要求我提供我正在尝试编译的代码库副本。
  • 我还想过制作一个迭代CC = g++ CC_FLAGS = -w `pkg-config opencv --cflags` LINK = g++ LINKOPTS = -pg `pkg-config opencv --libs` SOURCES = $(wildcard */*.cpp) OBJECTS = $(SOURCES:.cpp=.o) EXEC = $(SOURCES:.cpp=.out) %.out: %.o $(LINK) $< $(LINKOPTS) -o $@ %.o: %.cpp $(CC) -c $(CC_FLAGS) $< -o $@ clean: rm -f $(EXEC) $(OBJECTS) 目录的脚本,并为每个目录创建一个Makefile。然后,我在脚本中创建另一个函数,在每个目录中调用Make一次。不过,做一个大型Makefile的想法听起来更有趣。

编辑:如果我使用tutorial_code/Chapter[1-10]并将Makefile放在SOURCES = $(wildcard *.cpp)个文件所在的同一目录中,则有效。但是,我仍然想弄清楚如何让cpp深入到子目录中。

编辑2:上面显示的Makefile现在可以正常工作了。要查看早期版本,请随意滚动编辑历史记录。

1 个答案:

答案 0 :(得分:3)

您可以编写wildcard版本,只使用make函数以递归方式处理任何深度:

find-recursive = \
  $(wildcard $1/$2) \
  $(foreach f,$(wildcard $1/*/.),\
    $(call find-recursive,$(patsubst %/.,%,$f),$2))

SOURCES = $(call find-recursive,.,*.cpp)