pac*_*rop 12 c++ qmake makefile compilation cmake
我正在开发一个C++项目,它将被封装在更大的项目上.
我已经在更大的项目中看到过(是Qt应用程序并且它是从qmake生成的)我能够从linux命令行编译单个文件,只需输入特定文件的相对路径作为参数即可.
另一方面,我正在将CMake用于我自己的项目.当我修改编译单元的一些代码并且我必须修改它的头文件时,我必须等待很长时间来编译它的依赖项然后它自己的源文件.但在某些情况下,我更愿意检查*.cc文件中的源代码是否可编译而没有错误.
有没有办法从qake生成一个Makefile,就像qmake这样做?切换到qmake不再是一个选项.
Ose*_*Ose 20
您不必为CMake脚本添加额外的自定义目标,因为CMake生成的Makefile已经包含每个.cc文件的.o目标.例如,如果您调用了源文件mySourceFile.cc,则构建目录中将有一个Makefile,用于定义调用的目标<Some Path>/mySourceFile.cc.o.如果你cd进入你的构建目录,你可以使用grep或ack-grep找到定义这个目标的Makefile,然后cd进入该Makefile的目录并构建它.
例如,假设命令ack-grep mySourceFile.cc.o打印如下:
foo/bar/Makefile
119:x/y/z/mySourceFile.o: x/y/z/mySourceFile.cc.o
123:x/y/z/mySourceFile.cc.o:
124: # recipe for building target
Run Code Online (Sandbox Code Playgroud)
然后你可以mySourceFile.cc.o通过以下方式构建:
cd foo/bar && make x/y/z/mySourceFile.cc.o
Run Code Online (Sandbox Code Playgroud)
CMake没有通用的内置方式(这是一个开放的问题),但是如果你使用Ninja生成器,你可以使用特殊的Ninja语法来构建给定源文件的直接输出.例如,要编译,foo.o您将使用:
ninja /path/to/foo.cpp^
Run Code Online (Sandbox Code Playgroud)
不是开箱即用的.CMake不会在主makefile中公开那些"内部"makefile规则.
只有在考虑CMake内部使用何种文件结构时,才能执行此操作.您可以使用例如.obj使用CMake生成的makefile调用来编译单个文件
make -f CMakeFiles/myProg.dir/build.make CMakeFiles/myProg.dir/main.cc.obj
Run Code Online (Sandbox Code Playgroud)
当你有类似的东西
cmake_minimum_required(VERSION 3.1)
project(myProg CXX)
file(WRITE "main.cc" "int main()\n{\nreturn 0;\n}")
add_executable(myProg main.cc)
Run Code Online (Sandbox Code Playgroud)