1. cmake-流程和使用
cmake基本流程
- 配置:在CMakeLists.txt編寫規則(編譯規則(預處理 編譯 彙編 連結), 安裝(部署)規則, 測試規則)。
- 生成:根據CMakeLists.txt 和 引數(使用cmake時傳入的引數或者環境變數引數) 針對不同平臺(
-G <generator>
) 生成對應的編譯檔案(例如 Linux下的Makefile, Windows下的*.sln
, Mac OS 下的*.xcodeproj
)
還需要使用特定平臺的編譯器(make vs) 構建專案(包括: 預處理 編譯(
*.i
) 彙編(*.o
) 連結 測試 部署 等等) 不過這不屬於cmake的職責了
執行方式
Command Line
cmake <srccode_dir> --build <build_dir> -G <generator>
- 原始碼路徑()必須指定
- build路徑()預設是當前路徑”.”
- 生成器 如果不指定測試用預設值,如 linux下Unix Makefiles
windows下Visual Studio 12 2013 Win64
常用方式:
mkdir build
cd build
cmake ..
cmake-gui
配置原始碼路徑(等價於命令列中 ) 以及build路徑(等價於命令列中)
配置生成器選項(等價於命令列 -G )
After the initial configure step, the GUI will show you a list of cache variables, similar to the list you see when you run cmake -L -N .
from the command line.New cache variables are highlighted in red. (In this case, that’s all of them.) If you click Configure again, the red highlights will disappear, since the variables are no longer considered new.
Once you’ve customized the cache variables to your liking, click Generate. This will generate the build pipeline in the binary folder. You can then use it to build your project.
ccmake
ccmake
is the console equivalent to cmake-gui
. Like the GUI, it lets you set cache variables interactively. It can be handy when running CMake on a remote machine, or if you just like using the console
各個平臺下執行
unix (Unix Makefiles
)
CMake generates a Unix makefile by default when run from the command line in a Unix-like environment. Of course, you can generate makefiles explicitly using the -G
option. When generating a makefile, you should also define the CMAKE_BUILD_TYPE
variable. Assuming the source folder is the parent:
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug ..
You should define the CMAKE_BUILD_TYPE
variable because makefiles generated by CMake are single-configuration. Unlike a Visual Studio solution, you can’t use the same makefile to build multiple configurations such as Debug and Release. A single makefile is capable of building exactly one build type. By default, the available types are Debug, MinSizeRel, RelWithDebInfo and Release. Watch out – if you forget to define CMAKE_BUILD_TYPE
, you’ll probably get an unoptimized build without debug information, which is useless. To change to a different build type, you must re-run CMake and generate a new makefile.
Once the makefile exists, you can actually build your project by running make
. By default, make
will build every target that was defined by CMakeLists.txt
# 預設編譯所有目標
make
# 指定目標
make <target>
#You can also parallelize the build by passing `-j 4`(or a higher number) to `make`.
make -j 4
The makefile generated by CMake detects header file dependencies automatically, so editing a single header file won’t necessarily rebuild the entire project.
windows (Visual Studio 12 2013
等)
We’ll generate a Visual Studio .sln
file from the CMake command line. If you have several versions of Visual Studio installed, you’ll want to tell cmake
which version to use. Again, assuming that the source folder is the parent:
cmake -G "Visual Studio 15 2017" ..
#above ommand line will generate a Visual Studio `.sln` file for a 32-bit build. There are no multiplatform `.sln` files using CMake, so for a 64-bit build, you must specify the 64-bit generator:
cmake -G "Visual Studio 15 2017 Win64" ..
cmake -G "Visual Studio 12" ..
cmake -G "Visual Studio 12 Win64" ..
cmake -G "Visual Studio 12 2013" ..
cmake -G "Visual Studio 12 2013 Win64" ..
cmake -G "Visual Studio 14" ..
cmake -G "Visual Studio 14 Win64" ..
cmake -G "Visual Studio 14 2015" ..
cmake -G "Visual Studio 14 2015 Win64" ..
Open the resulting .sln
file in Visual Studio, go to the Solution Explorer panel, right-click the target you want to run, then choose “Set as Startup Project”. Build and run as you normally would.
Note that CMake adds two additional targets to the solution: ALL_BUILD and ZERO_CHECK. ZERO_CHECK automatically re-runs CMake when it detects a change to CMakeLists.txt
. ALL_BUILD usually builds all other targets, making it somewhat redundant in Visual Studio. If you’re used to setting up your solutions a certain way, it might seem annoying to have these extra targets in your .sln
file, but you get used to it. CMake lets you organize targets and source files into folders, but I didn’t demonstrate that in the CMakeDemo sample.
Like any Visual Studio solution, you can change build type at any time from the Solution Configuration drop-down list. The CMakeDemo sample uses CMake’s default set of build types, shown below. Again, I find the default Release configuration rather useless as it doesn’t produce any debug information. In my other CMake projects, I usually delete the Release configuration from CMakeLists.txt
and use RelWithDebInfo instead.
Built-In CMake Support in Visual Studio 2017
In Visual Studio 2017, Microsoft introduced another way to use CMake with Visual Studio. You can now open the source folder containing CMakeLists.txt
from Visual Studio’s File → Open → Folder menu. This new method avoids creating intermediate .sln
and .vcxproj
files. It also exposes 32-bit and 64-bit builds in the same workspace. It’s a nice idea that, in my opinion, falls short for a few reasons:
- If there are any source files outside the source folder containing
CMakeLists.txt
, they won’t appear in the Solution Explorer. - The familiar C/C++ Property Pages are no longer available.
- Cache variables can only be set by editing a JSON file, which is pretty unintuitive for a Visual IDE.
I’m not really a fan. For now, I intend to keep generating .sln
files by hand using CMake.
win/unix (Ninja)
CMake also exposes a Ninja generator. Ninja is similar to make
, but faster. It generates a build.ninja
file, which is similar to a Makefile
. The Ninja generator is also single-configuration. Ninja’s -j
option autodetects the number of available CPUs.
其它平臺( Xcode Qt Creator)
Other CMake Features
* You can perform a build from the command line, regardless of the generator used: cmake --build . --target CMakeDemo --config Debug
* You can create build pipelines that cross-compile for other environments with the help of the CMAKE_TOOLCHAIN_FILE
variable.
* You can generate a compile_commands.json
file that can be fed to Clang’s LibTooling library.
檢視當前平臺下可用的生成器:
cmake -h
我的windows結果如下
Generators
The following generators are available on this platform:
Visual Studio 15 2017 [arch] = Generates Visual Studio 2017 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 14 2015 [arch] = Generates Visual Studio 2015 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 12 2013 [arch] = Generates Visual Studio 2013 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 11 2012 [arch] = Generates Visual Studio 2012 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 10 2010 [arch] = Generates Visual Studio 2010 project files.
Optional [arch] can be "Win64" or "IA64".
Visual Studio 9 2008 [arch] = Generates Visual Studio 2008 project files.
Optional [arch] can be "Win64" or "IA64".
Visual Studio 8 2005 [arch] = Deprecated. Generates Visual Studio 2005
project files. Optional [arch] can be
"Win64".
Borland Makefiles = Generates Borland makefiles.
NMake Makefiles = Generates NMake makefiles.
NMake Makefiles JOM = Generates JOM makefiles.
Green Hills MULTI = Generates Green Hills MULTI files
(experimental, work-in-progress).
MSYS Makefiles = Generates MSYS makefiles.
MinGW Makefiles = Generates a make file for use with
mingw32-make.
Unix Makefiles = Generates standard UNIX makefiles.
Ninja = Generates build.ninja files.
Watcom WMake = Generates Watcom WMake makefiles.
CodeBlocks - MinGW Makefiles = Generates CodeBlocks project files.
CodeBlocks - NMake Makefiles = Generates CodeBlocks project files.
CodeBlocks - NMake Makefiles JOM
= Generates CodeBlocks project files.
CodeBlocks - Ninja = Generates CodeBlocks project files.
CodeBlocks - Unix Makefiles = Generates CodeBlocks project files.
CodeLite - MinGW Makefiles = Generates CodeLite project files.
CodeLite - NMake Makefiles = Generates CodeLite project files.
CodeLite - Ninja = Generates CodeLite project files.
CodeLite - Unix Makefiles = Generates CodeLite project files.
Sublime Text 2 - MinGW Makefiles
= Generates Sublime Text 2 project files.
Sublime Text 2 - NMake Makefiles
= Generates Sublime Text 2 project files.
Sublime Text 2 - Ninja = Generates Sublime Text 2 project files.
Sublime Text 2 - Unix Makefiles
= Generates Sublime Text 2 project files.
Kate - MinGW Makefiles = Generates Kate project files.
Kate - NMake Makefiles = Generates Kate project files.
Kate - Ninja = Generates Kate project files.
Kate - Unix Makefiles = Generates Kate project files.
Eclipse CDT4 - NMake Makefiles
= Generates Eclipse CDT 4.0 project files.
Eclipse CDT4 - MinGW Makefiles
= Generates Eclipse CDT 4.0 project files.
Eclipse CDT4 - Ninja = Generates Eclipse CDT 4.0 project files.
Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files.
我的ubuntu結果如下
Generators
The following generators are available on this platform:
Unix Makefiles = Generates standard UNIX makefiles.
Ninja = Generates build.ninja files.
Watcom WMake = Generates Watcom WMake makefiles.
CodeBlocks - Ninja = Generates CodeBlocks project files.
CodeBlocks - Unix Makefiles = Generates CodeBlocks project files.
CodeLite - Ninja = Generates CodeLite project files.
CodeLite - Unix Makefiles = Generates CodeLite project files.
Eclipse CDT4 - Ninja = Generates Eclipse CDT 4.0 project files.
Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files.
KDevelop3 = Generates KDevelop 3 project files.
KDevelop3 - Unix Makefiles = Generates KDevelop 3 project files.
Kate - Ninja = Generates Kate project files.
Kate - Unix Makefiles = Generates Kate project files.
Sublime Text 2 - Ninja = Generates Sublime Text 2 project files.
Sublime Text 2 - Unix Makefiles
= Generates Sublime Text 2 project files.