在CMake项目下编译单个文件?

时间:2016-07-08 16:21:15

标签: c++ makefile compilation cmake qmake

我正在开发一个C ++项目,它将被包含在更大的项目中。

我在更大的项目上看到过(是Qt应用程序并且它是从qmake生成的)我能够从linux命令行编译单个文件,只需输入特定文件的相对路径作为参数制作。

另一方面,我正在将CMake用于我自己的项目。当我修改编译单元的一些代码并且我必须修改它的头文件时,我必须等待很长时间来编译它的依赖项然后它自己的源文件。但在某些情况下,我更愿意检查* .cc文件中的源代码是否可以编译而没有错误。

有没有办法从qake生成一个Makefile,就像qmake这样做的?切换到qmake不再是一种选择。

6 个答案:

答案 0 :(得分:18)

您不必为CMake脚本添加额外的自定义目标,因为CMake生成的Makefile已经包含每个.cc文件的.o目标。例如。如果您有一个名为mySourceFile.cc的源文件,则构建目录中将有一个Makefile,用于定义名为<Some Path>/mySourceFile.cc.o的目标。如果你cd进入你的构建目录,你可以使用grepack-grep找到定义这个目标的Makefile,然后找到cd到该Makefile的目录并构建它。 / p>

E.g。假设命令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

然后您可以通过以下方式构建mySourceFile.cc.o

cd foo/bar && make x/y/z/mySourceFile.cc.o

答案 1 :(得分:6)

不是开箱即用的。 CMake没有暴露那些&#34;内部&#34;主makefile中的makefile规则。

只有在考虑CMake内部使用何种文件结构时,才能执行此操作。你可以,例如使用CMake生成的makefile调用编译单个.obj文件

make -f CMakeFiles/myProg.dir/build.make CMakeFiles/myProg.dir/main.cc.obj

当你有类似

的东西时
cmake_minimum_required(VERSION 3.1)

project(myProg CXX)

file(WRITE "main.cc" "int main()\n{\nreturn 0;\n}") 
add_executable(myProg main.cc)

答案 2 :(得分:6)

CMake没有通用的内置方法(这是open issue),但如果您使用Ninja生成器,则可以使用special Ninja syntax进行构建给定源文件的直接输出。例如,要仅编译foo.o,您将使用:

ninja /path/to/foo.cpp^

答案 3 :(得分:1)

要单独构建src / foo.cpp:

cmake --build . --target src/foo.cpp.o

答案 4 :(得分:0)

不,CMake不提供编译单个文件的内置支持。

您必须为每个目标文件添加目标,可能是通过迭代目录的所有文件的函数。

答案 5 :(得分:0)

其他人建议了从.cpp.o文件名中查找目标名称(以.cpp结尾)的方法,但是如果您已经知道将触发{{1}编译的目标名称, }文件,而您正在使用忍者,则此建议应该更容易。

首先建立目标:

.cpp

假设您的文件已更改或尚未构建,忍者将打印完整的目标名称。当看到名称出现时,请按Enter键,这样它不会被覆盖。然后只需从终端复制名称即可(例如,使用tmux复制模式)。