(转)Windows上使用CMake

CMake简介

原文:http://blog.gclxry.com/use-cmake-on-windows/windows

你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不一样的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:若是软件想跨平台,必需要保证可以在不一样平台编译。而若是使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工做。app

CMake就是针对上面问题所设计的工具:它首先容许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,而后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而作到“Write once, run everywhere”。函数

Windows上使用CMake

Windows上使用CMake也很方便,除了传统的命令行方式使用CMake,还有一个简单的GUI程序cmake-gui.exe来使用CMake。工具

安装CMake

Windows上安装CMake很简单,去https://cmake.org/ 上面下载最新的CMake安装包就能够了。安装的时候还能够选择是否把CMake加到系统的PATH中,以下图所示:post

image01

为了方便起见,能够把CMake加到系统PATH中。visual-studio

CMake的GUI用法

安装好CMake,会建立一个快捷方式,点击运行就会运行CMake-gui.exe,这个是CMake的GUI程序,如下图所示:ui

image04

source code编辑框就是输入代码的所在的路径,这个路径可以找到一个CMakeLists.txt文件。google

build the binaries编辑框就是编译输出的中间文件和最终的二进制文件的目录。url

由于CMake最终经过CMakeLists.txt文件生成Windows上对应的vs工程文件,不一样的vs版本也会影响到最终生成vs工程文件,因此configure对话框就是选择代码编译工具的,如图所示:spa

image03

下面以google test工程的代码为例来使用CMake-gui,输入google test对应的路径,点击Generate按钮就会在E:/googletest/googletest/build目录生成vs编译工程文件:

image00

image02

用vs打开gtest.sln文件,就能够编译google test代码了。

CMake的命令行用法

CMake的命令行用法比GUI的用法复杂,可是功能更增强大,值得一学。如下是CMake命令行调用的方法:

 

生成编译工程文件

cmake <CMakeLists.txt_Path>就是生成能够编译工程文件。当时运行的目录在哪里,生成的可编译工程文件就在哪一个目录。好比CMakeLists.txt文件在f:cmake目录,而当时在f:cmakebuild目录运行cmake ..,则生成的编译工程文件在f:cmakebuild目录。

也能够再生成编译工程文件的时候经过-D来添加变量值,好比CMakeLists.txt内容以下:

咱们能够经过-D选择来设置EXECUTABLE_OUTPUT_PATH的值,也是编译的文件的输出目录:

这样,咱们就给CMakeLists.txt编译脚本传递了新的EXECUTABLE_OUTPUT_PATH值。

编译工程

CMake除了生成编译工程文件,它也能够调用系统的编译工程来编译工程,如:

默认是编译debug模式,也能够传递在–后面传递MSBUILD参数来控制:

 

命令行工具模式

CMake有一个-E的命令行工具模式,提供了一些经常使用的功能,比复制文件、建立目录、读写注册表、读写环境变量、计算md5值等等。脚本能够调用这些功能。

编写CMakeLists.txt

建立能够执行程序工程

首先从建立一个最简单的可执行程序开始,CMakeLists.txt内容以下:

第1行是cmake须要的最低版本,目前这个是VERSION 2.6,通常不用修改。

第2~4行表示咱们建立了一个名为LearnCMake工程,对应生成一个LearnCMake.sln。project函数表示建立一个工程。同时,也生成了4个变量:

  • PROJECT_SOURCE_DIR, <PROJECT-NAME>_SOURCE_DIR。工程的源代码目录。
  • PROJECT_BINARY_DIR, <PROJECT-NAME>_BINARY_DIR。工程的二进制文件目录。

第5行表示添加一个名为FirstExecutable的可执行程序项目,它的源代码为hello_world.cpp。下面是add_executable的完整用法:

默认的是建立控制台工程,加上WIN32表示建立的是win32工程,以下:

后面是项目的代码,能够添加多个代码文件,用空格分开。

建立库工程

建立库工程跟建立可执行程序工程相似,建立库工程使用add_library函数,以下例子:

add_library的用法以下:

默认的是静态库,也能够显式的设置库是否为静态库、动态库或者是模块。另外BUILD_SHARED_LIBS也可控制编译成哪一种库。

target_link_libraries用来连接库,用法以下:

 

set设置变量

add_library、add_executable均可以添加多个源文件,以下:

咱们能够经过定义一个AppUtilSrc变量来代替app_util.h app_util.cpp,以下:

效果是跟上面等价的。还能够累积值:

这样AppUtilSrcs就表明着3个文件了。

设置编译模式

设置mt编译模式:

设置md编译模式:

默认是多字节模式,设置成unicode模式:

另外add_definitions还能够设置其余的选项。

添加其余CMakeLists.txt

一个CMakeLists.txt里面的target若是要连接其余CMakeLists.txt中的target,能够使用add_subdirectory,咱们以使用googletest库为例:

 

代码控制

若是想把./pbase/src目录下的全部源文件加入到工程,能够用aux_source_directory把某个目录下的源文件加入到某个变量中,稍后就能够使用这个变量表明的代码了,如:

添加头文件包含目录是:

可是include_directories中的文件不会体现先visual studio工程中,而aux_source_directory只会添加源文件,会忽略头文件,若是想生存的visual studio工程里面也包含头文件,能够这样:

若是想生存visual studio中的filter,能够使用source_group:

最终添加头文件到工程里标准模板是:

 

发表评论

相关文章
相关标签/搜索