CMake的安装和使用

转自:http://blog.youkuaiyun.com/sallyanna000/article/details/6579158


1.    cmake安装

(1)从源码安装

下载cmake源码cmake-2.6.2.tar.gz

http://www.cmake.org/cmake/resources/software.html

编译安装

tar xvf cmake-2.6.2.tar.gz

cd cmake-2.6.2/

如果本机上不存在cmake,则:

./bootstrap

make

make install

如果本机上存在cmake,想安装一个新版本,则:

cmake .

make

make install

(2)从二进制安装

sudo apt-get install cmake

2.    cmake运行

(1)运行cmake with GUI

如果系统中有curses库的话,cmake将生成一个可执行文件ccmake,它是一个基于文本程序的终端,有点类似windows GUI。

在源码目录中运行ccmake .,生成的二进制文件存放在源码目录下

当然也可以在其他目录下运行ccmake,只是要指定你想编译的源码的路径

ccmake的使用

当我们在源码目录下运行ccmake . 时,终端将显示如下:

 

当我们键入c时,ccmake将编译

当我们键入方向键时,可以选择cache entry

当我们键入enter时,可以编辑cache entry

当我们键入g时,将生成Makefile,然后退出

当我们键入h时,将弹出帮助文档

当我们键入q时,将退出ccmake

当我们键入t时,可以打开或关闭advanced cache entry

(2)运行cmake from the command line

如果源码没有太多的选项(在CMakeCache.txt文件中),可以只用cmake .来产生Makefile。

如果源码选项太多,比如VTK,可以把参数-i传递给cmake,如:cmake -i .,

cmake将让你为每一个cache file文件中的选项指定一个值,也能让你增加新的选项到文件CMakeCache.txt中,或者使用ccmake,或者使用CMakeSetup。

当然,也可以传递设置选项的参数给cmake,如:

cmake -DVARIABLE:TYPE=VALUE .

2.    CMake cache

cmake第一次运行的时候,它将产生一个文件叫CMakeCache.txt,该文件可以被看作一个配置文件,它里面的内容就像传递给configure命令的参数集,CMake GUI可以帮你很容易修改它,当然也可以直接对该文件做修改;如果你的CMakeLists.txt文件做过较大幅度的修改,你需要从cache中删除相关的选项,如果你还没有手动编辑过cache文件,在你重新运行cmake之前需删除它。

3.    Cmake语法

(1)基本概念

cmake使用Cmake  dfjs;dfasfLists.txt文件,该文件用include或者add_subdirectory命令来增加额外的输入文件。

注释行以#开头到该行结尾

命令是由命令名,加括号,括号中的参数用空白隔开,它可以是内建的命令如add_library,或者用户定义的宏或函数

所有的空格,包含空白符,空行,tabs,当然除了用来隔开参数的空白,都被忽略

(2)变量

。字符串

一个字符串是用双引号括起来的,也可以被分隔在多行,如:

set(MY_STRING “this is a string with a

newline in

it”)

在一个字符串中也可以用变量,如:

set(VAR “

hello

world

”)

当执行message(“/${VAR}=${VAR}”)后,将打印:

${VAR}=

hello

world

也可以message(“/n/thello world”)后,将打印:

hello world

。字符串列表

cmake基本的数据类型为字符串,也可以支持字符串列表,如:

set(VAR a;b;c)或set(VAR a b c)将把VAR设置为字符串列表

要使用VAR,可以用${VAR},如:

command(${VAR}),它相当于command(a b c)

如果想把一个字符串列表作为单个参数传递给命令,可以用双引号,如:

command(“${VAR}”),相当于command(“a b c”)

(3)流程控制

。判断

if(var)

some_command(...)

        endif(var)

当var的值不为empty,0,N,NO,OFF,FALSE,NOTFOUND

-NOTFOUND,some_command(...)将被执行

。循环

set(VAR a b c)

foreach(f ${VAR})

message(${f})

        endforeach(f)

用变量f依次代替a,b,c执行message()

。宏和函数定义

定义一个宏hello

macro(hello MESSAGE)

message(${MESSAGE})

        endmacro(hello)

调用宏hello

hello(“hello world”)

定义一个函数hello

function(hello MESSAGE)

message(${MESSAGE})

        endfunction(hello)

(4)正则表达式

很多CMake命令如if,会使用正则表达式作为参数,下面是正则表达式会用到的特殊字符:

^:匹配一行或一个字符串的开头

$:匹配一行或一个字符串的结尾

.:匹配单个字符

[]:匹配方括号中任意字符或字符串

[^]:匹配不是方括号中的字符或字符串

[-]:匹配在dash任意一边的字符

*:匹配0或多个先前的字符序列

+:匹配1或多个先前的字符序列

?:匹配0或1个先前的字符序列

():保存一个匹配的表达式,以便以后使用

参考:http://www.cmake.org/cmake/help/documentation.html


以下转自:http://www.cppblog.com/Roger/archive/2011/11/17/160368.html


Cmake优点:

1.       开发源代码,实用类BSD许可发布。

2.       跨平台,并可以生成native编译配置文件,在linux/unix平台,生成makefile,在mac平台可以生成xcode,在windows平台可以生成msvc工程的配置文件。

3.       能够管理大型项目

4.       简化编译构建过程和编译过程,只需要cmake+make就可以

5.       高效率

6.       可扩展,可以为cmake编写特定功能的模块,扩充cmake功能

如何安装cmake

1.       Cmake的安装可以使用autotools进行安装,点击cmake-2.8.6.tar.gz 链接,可以对软件进行下载。

2.       ./configure

3.       make

4.       sudo make install

 

Cmake的原理

 

Helloworld cmake

//main.cpp

#include<cstdio>

 

int main()

{

    printf("hello world from main\n");

    return 0;

}

 

创建CMakeLists.txt(注意大小写一个字母都不能错)

向该文件中加入以下几行(稍后会做解释)

PROJECT (HELLO)

SET(SRC_LIST main.cpp)

MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})

MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})

ADD_EXECUTABLE(hello ${SRC_LIST})

运行以下命令:

cmake . (别忘记加上这个点,表示当前目录)


注意执行完这句话之后会生成几个文件如下:


CMakeFiles, CMakeCache.txt, cmake_install.cmake等文件,并且生成了Makefile

然后执行make 就可以生成可执行文件hello


这是当前目录下就会生成可执行文件如下图:


对例子的解释:

CMakeLists.txt的内容如下:

PROJECT (HELLO)

SET(SRC_LIST main.cpp)

MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})

MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})

ADD_EXECUTABLE(hello ${SRC_LIST})

 

Project的指令的语法是:

PROJECT(projectname [CXX] [C] [JAVA])

这个执行是用来定义工程的名称的和定义工程支持的语言。这个指令也隐式的定义了两个cmake变量:<projectname>_BINARY_DIR以及<projectname>_BINARY_DIR,这里就是HELLO_BINARY_DIR和HELLO_SOURCE_DIR,两个变量指的都是当前工程的路径。

SET指令的语法:

SET(VAR[VALUE] [CACHE TYPE DOCSTRING [FORCE]])

Set指令是用来显式的定义变量的,我们之前用到的是SET(SRC_LIST main.cpp)如果有多个源文件,也可以定义成SET(SRC_LIST main.cpp t1.cpp t2.cpp)。

 

MESSAGE指令的语法是:

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)

这个指令用于向终端输出用户信息,包含三种类型:

SEND_ERROR,产生错误,生成过程被跳过。

SATUS,输出前缀为-的信息。

FATAL_ERROR,立即终止所有cmake过程。

我们在这里使用的是STATUS信息输出,显示了由PROJECT指令顶一顶两个饮食变量HELLO_BINARY_DIR和HELLO_SOURCE_DIR。

 

ADD_EXECUTABLE(hello ${SRC_LIST})

定义了这个工程会生成一个文件名为hello的可执行文件,相关的源文件是SRC_LIST中定义的源文件列表,本例中你可以直接写成ADD_EXECUTABLE(hello main.c)。

 

将本例改写成一个最简化的CMakeLists.txt:

PROJECT(HELLO)

ADD_EXECUTABLE(hello main.c)

 

下面我们介绍一个比较实用的例子,即包含生成静态库又包含引入外部头文件和链接库的cmake demo。

先按照工程规范建立工程目录,并编写代码,以下面的工程目录为例进行解释这个例子,工程的目录结构为:

 

编译工程要实现的目标:

1. 添加子目录doc,用以放置这个工程的文档hello.txt

2. 生成hello的静态库,并在main可执行程序链接hello静态库

3. 在这个工程中添加COPYRIGHT,README

4. 在工程目录中添加一个run.sh的脚本,用以调用生成的二进制可执行文件

5. 将生成的二进制文件生成到bin子目录中

6. 编写安装程序

 

1. 编写CMakeLists.txt

由于一个工程目录中包含多个项目,其中在此项目中包含util项目和main项目,其中util项目是用以生成main程序需要的静态库,main是用以生成可执行文件。

在工程项目中的父目录向有一个CMakeLists.txt是用以声明定义工程需要的Cmake设置还定义了子目录src,用以递归的调用src中的MakeLists.txt。其中工程目录的CMakeLists.txt内容定义如下:

PROJECT(HELLO)

ADD_SUBDIRECTORY(src)

在src里面的CMakeLists.txt是用以定义src目录包含的两个工程的依赖关系分别进行编译。

util目录里面的CMakeLists.txt是用以定义生成util静态库的规则,其中内容如下:

SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib)

SET(CMAKE_C_COMPILER g++)

SET(SRC_LIST hello.c)

 

INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)

ADD_LIBRARY(util STATIC ${SRC_LIST})

其中SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib)定义了库生成的路径,LIBRARY_OUTPUT_PATH是一个内部变量,存放库生成路径。

SET(SRC_LIST hello.c)是用来定义库文件需要的源文件。

INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)是用来定义非标准库头文件要搜索的路径。其中INCLUDE_DIRECTORIES命令的格式为:

INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)

ADD_LIBRARY(util STATIC ${SRC_LIST})是用来定义生成的库的名字,以及生成库的类型和生成库需要的源文件,其中ADD_LIBRARY命令格式为:

     ADD_LIBRARY(libname    [SHARED|STATIC|MODULE]

          [EXCLUDE_FROM_ALL]

                source1 source2 ... sourceN)

SET(CMAKE_C_COMPILER g++)是用来定义c的编译器为g++,防止出现C和C++代码在不指定C编译器的情况下默认使用gcc,导致系统编译混乱。

在main目录中的CMakeLists.txt是用来定义可执行程序编译和链接时所需要的一些命令或环境。内容如下:

SET(EXECUTABLE_OUTPUT_PATH ${HELLO_SOURCE_DIR}/bin)

SET(SRC_LIST main.cpp)

 

INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)

LINK_DIRECTORIES(${HELLO_SOURCE_DIR}/lib)

 

ADD_EXECUTABLE(hello ${SRC_LIST})

TARGET_LINK_LIBRARIES(hello util)

INCLUDE_DIRECTORIES命令是定义工程的include文件夹,其中存放使用到的库的头文件,LINK_DIRECTORIES是定义工程的库文件,其中存放着库文件,ADD_EXECUTABLE是定义生成的可执行文件,TARGET_LINK_LIBRARIES用以定义链接时需要的库文件。

2.在工程目录下创建build目录,并采用out-of-source方式编译项目。执行命令make ..,执行结果如下:


执行make,这时在build目录下生成了中间编译文件:


执行make命令,结果如下:


可以看到工程创建和编译成功了。

2. 安装

在工程目录下添加COPYRIGHT、README、和run.sh,重新编辑工程目录下的CMakeLists.txt。在CMakeLists.txt中添加如下命令:

INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake_demo)

INSTALL(PROGRAMS run.sh DESTINATION bin)

INSTALL(PROGRAMS bin/hello DESTINATION bin)

INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake_demo)

这些命令表示在执行make install命令时,安装程序会拷贝相应的文件、目录或程序到指定的前缀开始的目录中,cmake执行命令如下:

cmake -DCMAKE_INSTALL_PREFIX=~/data/cmake_demo ..这时将工程目录安装到~/data/cmake_demo目录下。执行结果如下:


其中cmake编译c、c++工程完毕。


<think>好的,我现在需要回答用户关于CMake安装方法基本使用的问题。首先,用户提到了他们参考了两个引用,一个是关于从官网下载安装程序,另一个是CMakeLists.txt的基础结构。我需要确保我的回答涵盖这两个方面,并且符合用户给出的格式要求。 首先,安装部分。用户提到了Windows系统,所以我需要详细说明Windows下的安装步骤。可能包括下载安装程序、运行安装向导、选择安装路径、添加环境变量等。还要注意是否需要勾选添加PATH的选项,这点很重要,否则用户可能无法在命令行中使用CMake。另外,可能需要提到不同版本的选择,比如32位或64位系统对应的安装包。 接下来是基本用法。用户需要了解CMakeLists.txt的基本结构。我应该从最简单的例子开始,比如指定CMake的最低版本、项目名称、添加可执行文件。然后可能需要扩展,比如如何包含头文件目录、链接库文件。这部分需要给出具体的代码示例,并解释每个命令的作用。例如,cmake_minimum_required设置最低版本,project定义项目名,add_executable生成可执行文件,include_directories添加头文件路径,target_link_libraries链接库。 用户可能需要知道如何实际运行CMake,所以步骤应该是:创建CMakeLists.txt,运行cmake命令生成构建系统,然后编译。在Windows上,可能会生成Visual Studio的项目文件,或者使用MinGW的话,生成Makefile。这部分需要说明不同的生成器选项,比如-G参数指定生成器类型。 另外,用户可能遇到的常见问题,比如安装后无法找到命令,可能是因为环境变量没配置好,需要提醒用户检查PATH。或者在编译时找不到头文件或库,需要确认include_directoriestarget_link_libraries是否正确设置。 还需要考虑用户是否是初学者,所以语言要尽量简洁明了,避免使用过于专业的术语,或者在必要时解释术语。例如,解释什么是构建系统,生成器的作用是什么。 最后,生成相关问题。根据用户的需求,可能的问题包括如何配置多目录项目、如何添加第三方库依赖、如何管理不同构建类型(Debug/Release)、如何进行跨平台编译等。这些问题可以帮助用户进一步学习CMake的高级用法。 现在需要检查是否符合用户的所有要求:使用中文回答,行内公式用$...$,独立公式用$$...$$,虽然这里可能不太涉及数学公式,但要注意其他LaTeX语法是否正确。不过用户的问题主要是关于CMake安装使用,可能不太需要数学表达式,但需要确保代码块格式正确,使用反引号包裹,并标明语言类型。 另外,引用标识要自然地添加在引用段落的末尾。例如,在提到安装步骤时引用[^1],在讲解CMakeLists.txt结构时引用[^2]。需要确保引用标记正确对应。 总结回答结构应该是先安装教程,再基本用法,分步骤说明,代码示例,最后相关问题。确保每个部分清晰,符合用户的要求。</think>### CMake 安装教程与基本用法指南 #### **1. CMake 安装方法(Windows系统)** 1. **下载安装程序** 访问[CMake官网下载页面](https://cmake.org/download/),选择与系统匹配的安装包(例如:`Windows x64 Installer`)。 2. **运行安装向导** 双击安装程序,按提示完成以下步骤: - 同意许可协议 - 选择安装路径(默认路径为`C:\Program Files\CMake`) - **关键步骤**:勾选`Add CMake to the system PATH for all users`(将CMake添加到系统环境变量)。 3. **验证安装** 打开命令行工具,输入以下命令: ```bash cmake --version ``` 若显示版本号(例如`CMake 3.28.0`),则安装成功。 --- #### **2. CMake 基本用法** CMake通过编写`CMakeLists.txt`文件定义项目配置,以下是核心步骤: ##### **2.1 最简单的项目配置** 创建`CMakeLists.txt`文件并输入以下内容: ```cmake cmake_minimum_required(VERSION 3.10) # 指定CMake最低版本 project(MyProject) # 定义项目名称 add_executable(hello hello.cpp) # 生成可执行文件hello,源文件为hello.cpp ``` - `cmake_minimum_required`:确保CMake版本兼容性。 - `project`:设置项目名称及默认编程语言(如C++)。 - `add_executable`:将源代码编译为可执行文件。 ##### **2.2 生成构建系统** 在项目根目录下执行以下命令: ```bash mkdir build && cd build # 创建构建目录 cmake .. # 生成构建系统(如Makefile或Visual Studio项目) ``` - 使用`-G`参数指定生成器类型(例如`cmake -G "Visual Studio 17 2022" ..`)。 ##### **2.3 编译项目** 根据生成的构建系统执行编译: ```bash cmake --build . # 编译项目(Windows默认生成Debug版本) ``` ##### **2.4 进阶配置示例** 包含头文件目录与链接库: ```cmake include_directories(include) # 添加头文件目录 add_library(mylib STATIC src/mylib.cpp) # 编译静态库mylib add_executable(app main.cpp) target_link_libraries(app mylib) # 将库链接到可执行文件 ``` --- #### **3. 常见问题解决** - **CMake命令未找到**:检查环境变量`PATH`是否包含CMake安装路径[^1]。 - **编译失败**:确认`CMakeLists.txt`语法正确,路径无错误[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值