CMake 基本使用方法--写CMakeList.txt

本文详细介绍如何使用CMake进行软件项目构建管理。从简单的HelloWorld示例出发,逐步讲解CMakeLists.txt文件的编写方法,包括如何设置项目名称、添加可执行文件、库文件等,并深入探讨条件编译、依赖管理和跨平台支持等高级特性。
这一章将从软件开发者的角度来描述如何实用CMake。也就是说,如果你的目标是用CMake来管理你的生成过程,请阅读这一章。

CMake的输入

COMMAND(args)

这里的 COMMAND 是命令行的名称,args是用空格分割的参数列表。典型的,对与每一个项目的目录存在一个CMakeLists.txt。 下面我们将从一个简单的Hello world例子开始介绍, 它的源代码树形文件包含这些文件:

Hello.c CMakeLists.txt

CMakeLists.txt将包含下面两行:

PROJECT(Hello)
ADD_EXECUTABLE(Hello Hello.c)

为了生成Hello的可执行程序,你只需依照上面CMake运行的过程描述来生成makefiles文件。 PROJECT 命令表明了产生的工作空间的名称。 ADD_EXECUTABLE命令添加可执行的目标到生成程序。这个简单的程序就只需要这些设置。如歌你的项目需要一些文件才能编译也很容易,只想修改ADD_EXECUTABLE命令行如下:

ADD_EXECUTABLE(Hello Hello.c File2.c File3.c File4.c)

ADD_EXECUTABLE只是很多CMake命令中的一种。比如更复杂的如下:

PROJECT(HELLO)
SET(HELLO_SRCS Hell.c File2.c File3.c)
IF(WIN32)
  SET(HELLO_SRCS ${HELLO_SRCS} WinSupport.c)
ELSE (WIN32)
  SET(HELLO_SRCS ${HELLO_SRCS} UnixSupport.c)
ENDIF (WIN32)

ADD_EXECUTABLE (Hello ${HELLO_SRCS})

#look for the Tcl library
FIND_LIBRARY(TCL_LIBRARY NAMES tcl tc184 tc183 tc 182 tc 180
  PATHS /usr/lib /usr/local/lib)
IF (TCL_LIBRARY)
  TARGET_ADD_LIBRARY (Hello TCL_LIBRARY)
ENDIF(TCL_LIBRARY)

在这个例子中 SET 命令用于将源文件组成一个列表。 IF 命令用于增加WinSupport.c或者UnixSupport.c到列表中。 最后 ADD_EXECUTABLE 命令用于 采用源文件列表HELLO_SRCS中列出的文件 生成可执行文件。FIND_LIBRARY命令用于寻找在一些指定目录下的特定的Tcl库文件。如果找到了,就将他们添加到Hello可执行程序的链接命令。 #行为注释行。

CMake 是会定义一些使用的变量在CMakeList文件中。 比如,WIN32总是会在windows系统中被定义,而UNIX
总是在UNIX系统中被定义。

生成目标:(Build Targets)

SET()
SUBDIRS()
ADD_LIBRARY()
  这里生成静态链接文件,例如ADD_LIBRARY(Whole ${HELLO_SRC}),就会生成一个libWhole.a可供链接

ADD_EXECUTABLE()
AUX_SOURCE_DIRECTORY()
PROJECT()

CMake会循环的查找从当前目录到SUBDIRS列出的任何子目录的文件。SET命令用于设定一个变量。ADD_LIBRARY将添加一个库到目标之中。 ADD_EXECUTABLE添加一个可执行程序到目标列表中。(Note:编译器执行的顺序是先编译源文件,然后生成库文件,最后生成可执行文件)。AUX_SOURCE_DIRECTORY表示一个不在当前目录的包含源文件的目录。这些源代码将插入当前的库(LIBRARY)中。所有在AUX_SOURCE_DIRECTORY的文件将被编译(如,*.c,*.cxx,*.cpp等等)。PROJECT(ProjectName)是一个用在MSVC中的特殊变量,用于为编译器生成项目。他也为CMAKE定义连个有用的变量:ProjectName_SOURCE_DIR和ProjectName_BINARY_DIR.

编译的标示和选项。除了上面列出的命令外,CMakeLists.txt还包含如下的命令:
INCLUDE_DIRECTORIES()
LINK_DIRECTORIES()
LINK_LIBRARIES()
TARGET_LINK_LIBRARIES()

这些命令定义了用于编译源代码和生成可执行程序的目录和库。上面列出的目录的一个很重要的特性是它们会被任何子目录继承。也就是说,CMake依照目录的分层结构来承袭这些命令。在每次遇到对这些命令的描述的时候都会被展开一次。比如说,如果在顶层的CMakeLists文件中有定义INCLUDE_DIRECTORIES(/usr/include)和SUBDIRS(./subdir1),并且在./subdir1/CMakeLists.txt有INCLUDE_DIRECTORIES(/tmp/foobar),于是最后网状的结果是
INCLUDE_DIRECTORIES(/usr/include /tmp/foobar)

CMake会定义许多的模块来查找通常会用到的包,比如OpenGL或Java。 这些模块为你节省了很多的时间来编写这些查找包。这些模块可以像这样加到你的CMakeList文件中,如下:

INCLUDE(${CMAKE_ROOT}/Modules/FindTCL.cmake)

CMAKE_ROOT 总是定义在CMake中,用于指向CMake安装的路径。查看Modules子目录下的一些文件可以给你提供一些很好的idea关于怎样用这些CMake命令。

给项目文件添加一个新的目录
一个通用的方法来扩展一个项目文件是给他添加一个新的文件夹。这将包含三个步骤:
1.创建一个新的目录在你的源代码的分层目录中
2.将这个新的目录添加到SUBDIRS命令中
3.在这个新创建的目录中用适当的命令建立一个CMakeLists.txt文件
cmake后出现cmake version 2.8.12.2 Usage cmake [options] <path-to-source> cmake [options] <path-to-existing-build> Options -C <initial-cache> = Pre-load a script to populate the cache. -D <var>:<type>=<value> = Create a cmake cache entry. -U <globbing_expr> = Remove matching entries from CMake cache. -G <generator-name> = Specify a build system generator. -T <toolset-name> = Specify toolset name if supported by generator. -Wno-dev = Suppress developer warnings. -Wdev = Enable developer warnings. -E = CMake command mode. -i = Run in wizard mode. -L[A][H] = List non-advanced cached variables. --build <dir> = Build a CMake-generated project binary tree. -N = View mode only. -P <file> = Process script mode. --find-package = Run in pkg-config like mode. --graphviz=[file] = Generate graphviz of dependencies, see CMakeGraphVizOptions.cmake for more. --system-information [file] = Dump information about this system. --debug-trycompile = Do not delete the try_compile build tree. Only useful on one try_compile at a time. --debug-output = Put cmake in a debug mode. --trace = Put cmake in trace mode. --warn-uninitialized = Warn about uninitialized values. --warn-unused-vars = Warn about unused variables. --no-warn-unused-cli = Don't warn about command line options. --check-system-vars = Find problems with variable usage in system files. --help-command cmd [file] = Print help for a single command and exit. --help-command-list [file] = List available listfile commands and exit. --help-commands [file] = Print help for all commands and exit. --help-compatcommands [file]= Print help for compatibility commands. --help-module module [file] = Print help for a single module and exit. --help-module-list [file] = List available modules and exit. --help-modules [file] = Print help for all modules and exit. --help-custom-modules [file]= Print help for all custom modules and exit. --help-policy cmp [file] = Print help for a single policy and exit. --help-policies [file] = Print help for all policies and exit. --help-property prop [file] = Print help for a single property and exit. --help-property-list [file] = List available properties and exit. --help-properties [file] = Print help for all properties and exit. --help-variable var [file] = Print help for a single variable and exit. --help-variable-list [file] = List documented variables and exit. --help-variables [file] = Print help for all variables and exit. --copyright [file] = Print the CMake copyright and exit. --help,-help,-usage,-h,-H,/?= Print usage information and exit. --help-full [file] = Print full help and exit. --help-html [file] = Print full help in HTML format. --help-man [file] = Print full help as a UNIX man page and exit. --version,-version,/V [file]= Show program name/version banner and exit. Generators The following generators are available on this platform: Unix Makefiles = Generates standard UNIX makefiles. Ninja = Generates build.ninja files (experimental). CodeBlocks - Ninja = Generates CodeBlocks project files. CodeBlocks - Unix Makefiles = Generates CodeBlocks 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. Sublime Text 2 - Ninja = Generates Sublime Text 2 project files. Sublime Text 2 - Unix Makefiles = Generates Sublime Text 2 project files. 这些是什么意思,没有生成makefile文件,为什么?
最新发布
11-25
### `cmake version 2.8.12.2` 输出的 `Usage` 和 `Generators` 信息含义 #### `Usage` 信息含义 `Usage` 信息通常会展示 CMake基本使用方法和命令格式。一般来说,它会告知用户如何调用 CMake 来进行项目的配置和生成。例如,常见的使用方式是在项目根目录下创建一个 `build` 目录,然后进入该目录,使用 `cmake ..` 命令来配置项目。这里的 `..` 表示上一级目录,即包含 `CMakeLists.txt` 文件的目录。 #### `Generators` 信息含义 `Generators` 信息列出了 CMake 支持的各种生成器。生成器的作用是根据 `CMakeLists.txt` 文件生成特定的构建文件,不同的生成器会生成不同类型的构建文件。例如: - `Unix Makefiles`:生成适用于 Unix 系统的 `Makefile` 文件,后续可以使用 `make` 命令进行编译。 - `Visual Studio` 系列生成器:如 `Visual Studio 14 2015` 等,会生成 Visual Studio 项目文件,方便在 Windows 系统上使用 Visual Studio 进行开发和编译。 ### 没有生成 `Makefile` 文件的原因 #### 生成器选择问题 如果在调用 CMake 时没有指定生成器,或者指定了非 `Unix Makefiles` 的生成器,就不会生成 `Makefile` 文件。例如,使用以下命令指定生成 Visual Studio 项目文件: ```bash cmake -G "Visual Studio 14 2015" .. ``` 这样就会生成 Visual Studio 项目文件,而不是 `Makefile`。 #### `CMakeLists.txt` 文件问题 如果 `CMakeLists.txt` 文件存在语法错误或者配置不正确,CMake 在执行过程中可能会出错,从而无法生成 `Makefile` 文件。可以查看 CMake 输出的错误信息,根据提示修改 `CMakeLists.txt` 文件。 #### 权限问题 在某些情况下,由于文件或目录的权限不足,CMake 可能无法在指定目录下生成 `Makefile` 文件。可以检查目录的权限,确保当前用户有足够的权限进行文件的创建和修改。 #### 依赖问题 如果项目依赖的某些库或工具没有正确安装,CMake 在配置过程中可能会失败,导致无法生成 `Makefile` 文件。需要确保项目所需的所有依赖都已经正确安装。 ### 示例代码 以下是一个简单的 `CMakeLists.txt` 文件示例: ```cmake cmake_minimum_required(VERSION 2.8.12.2) project(MyProject) add_executable(myapp main.cpp) ``` 使用以下命令生成 `Makefile`: ```bash mkdir build cd build cmake -G "Unix Makefiles" .. ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值