这里其实应该说CMake管理的项目,如何快速查看其Preprocess文件。因为Clion默认使用CMake管理文件,所以这里对Clion也适用。
注意:仅适用CMake make,对于CMake ninja等不适用。
对于Clion项目,编译时会生成cmake-build-debug目录,里面是cmake编译项目的产物。如下图:
注意,这里最重要的是Makefile文件,里面会有一系列任务。
这里我们最关注的是“main.cpp.i”,其内容如下,作用是生成预处理preprocess文件。
代码语言:javascript复制# target to preprocess a source file
main.cpp.i:
$(MAKE) -f CMakeFiles/cppConcurrencyDemo.dir/build.make CMakeFiles/cppConcurrencyDemo.dir/main.cpp.i
和Makefile同级,然后执行“make main.cpp.i”,就会生成对应的preprocess文件。如下图:
这里来看下源文件和预处理后的文件对比:
查如何生成预处理文件是因为,写modern cpp时,想看下using后的会不会被预处理,“gcc -E”在大项目中不实用,所以找下有没有更智能更自动化的方法。
下图这里,左边的define在右侧可以看到已经被预处理了,但是using这些是不能被预处理的.
举一反三,我们在看下Makefile里还有什么有意思的target:
代码语言:javascript复制# target to generate assembly for a file
main.cpp.s:
$(MAKE) -f CMakeFiles/cppConcurrencyDemo.dir/build.make CMakeFiles/cppConcurrencyDemo.dir/main.cpp.s
可以看到,通过"make main.cpp.s",我们就可以生成对应的汇编文件。
这些任务,都可以从Help target中找到。
代码语言:javascript复制# Help Target
help:
@echo "The following are some of the valid targets for this Makefile:"
@echo "... all (the default if no target is provided)"
@echo "... clean"
@echo "... depend"
@echo "... rebuild_cache"
@echo "... edit_cache"
@echo "... cppConcurrencyDemo"
@echo "... main.o"
@echo "... main.i"
@echo "... main.s"
由于是借助于CMake和Makefile的能力,所以对于多文件的项目也是可以的。
参考:
http://anadoxin.org/blog/generating-preprocessed-sources-in-cmake-projects.html