我正在玩这个 OpenCV 2 Cookbook中的一些教程代码。该代码不附带任何 Makefile,我想创建一个 Makefile 可以制作 codebase 中的所有文件。我的计划是用分析编译所有文件,然后制作一个运行所有可执行文件并收集 gprof 结果的脚本。然后,我可以对各种 OpenCV 函数的计算时间有一些直觉。
代码库是这样安排的:tutorial_code/Chapter[1-10]/*.cpp
每个.cpp
文件都是自给自足的,可以在不链接到此代码库中的其他模块的情况下进行编译。(不过,有一些小型的仅标头库。)
以下是我坚持的几件事:
- 通常,
$(EXEC)
Makefile 中的 代表一个文件,该文件是大部分构建工作的结果。但是,就我而言,我想$(EXEC)
为每个文件创建一个单独的.cpp
文件。我想我已经接近正确了,但到目前为止我的 Makefile 只是生成*.o
但没有*.out
- 我知道这
SOURCES = $(wildcard *.cpp)
是一种“收集”当前目录中的 cpp 文件集的方法。SOURCES = $(wildcard */*.cpp)
向下钻取并获取.cpp
子目录中的所有文件是有道理的。不过,它似乎不起作用。
从本教程开始,我设置了一个实现建议功能的 Makefile。它不太工作......$(wildcard */*.cpp)
似乎没有深入到目录中,我不确定如何做类似的事情$<
并$@
引用basefilename.o
和创建basefilename.out
.
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)
- 我对 Makefiles 和 OpenCV 相当熟悉,并且通过在 Makefiles 中手动编码依赖项、对象等列表来编译我自己的项目也没有问题。然而,就手头的事情而言,在没有太多用户干预的情况下自动制作所有内容真是太棒了。
- 请随意评论、发送电子邮件或给我发消息,以获取我正在尝试编译的代码库的副本。
- 我还想过制作一个脚本来遍历
tutorial_code/Chapter[1-10]
目录并为每个目录创建一个 Makefile。然后,我会在脚本中创建另一个函数,在每个目录中调用一次 Make。不过,做一个宏大的 Makefile 的想法听起来更有趣。
编辑:如果我使用Makefile 并将其放置在文件所在的同一目录中,这确实有效。但是,我仍在试图弄清楚如何深入到子目录中。SOURCES = $(wildcard *.cpp)
cpp
$(wildcard */*.cpp)
编辑 2: 上面显示的 Makefile 现在可以正常工作。要查看早期版本,请随意滚动浏览编辑历史记录。