您的位置:首页 > 运维架构 > Linux

Linux下cmake使用简介

2016-04-29 16:58 561 查看

安装

sudo apt-get install cmake

这个应该是最简单的方法了,当然,你也可以去官网下载:www.cmake.org

然后运行

cmake –version 查看一下你是否安装完成

使用

cmake好像都说比直接写Makefile牛一点,因为它可以自动生成Makefile。专门针对文件比较多的情况,要不是这几天在用别人的代码,一大堆,我觉得用Makefile也够了,但是据说Linux程序员必备技能啊,所以还是要学学这么高端的东西。

在源代码目录src中建立CMakeLists.txt文件

先介绍点常用的:

1,工程名

project(TEST)  //表明工程名称,也可以指定工程支持的语言,默认情况下支持所有


这个指令隐式的定义了两个cmake变量:

_BINARY_DIR 和_SOURCE_DIR,在这里就是TEST_BINARY_DIR和TEST_SOURCE_DIR ,在采用内部编译时,这个两个变量指的都是工程所在路径。

同时系统也帮助我们预定义了PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR变量,他们的值分别跟TEST_BINARY_DIR TEST_SOURCE_DIR一致。为了统一,建议直接使用PROJECT_BINARY_DIR,因为即使改变工程名,也不会影响这两个变量。

注意这个工程名TEST和可执行文件test时没有关系的,可执行文件名可以随意取。

2,命名变量

这个意思就是#define,用一些变量来代替多次出现的一些比较繁琐的路径之类的,这个在makefile中,我们也会使用。不过是直接用“=”来定义。

set (INC_DIR /usr/local/include)  //头文件路径
set (LINK_DIR /usr/local/lib)     //库的路径
set (SRC_LIST main.cpp )          //源文件名称,源文件可以有多个,之间用空格隔开
set (LIB pthread Ice)           //库的名称


使用${}来引用变量,但是有一个列外,在IF控制语句中,变量是直接使用变量名引用。

3.去哪找头文件,类似-I

include_directories(${INC_DIR})  //用${} 来引用变量


4.去哪找库文件 类似-L

link_directories(${LINK_DIR})


5.生成可执行文件

add_ececutable( test ${SRC_LIST})  //生成一个执行文件test,源文件来自SRC_LIST的源文件列表


6.要链接的库文件名称

target_link_libraries(test ${LIB})  //相当于是链接了-lphread -lIce


7.向终端输出信息

message( SATUS "this is binary dir" ${TEST_BINARY_DIR})  //输出工程所在目录


语法为message([SEND_ERROR| STATUS| FATAL_ERROR] “message”…)

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

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

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

8.指令的大小写无关,参数和变量 大小写是相关的,推荐全部使用大写指令,大家别学我。

9.内部构建和外部构建

我们上面使用的就是内部构建,就是在工程文件目录下运行cmake,然后产生一堆临时文件,和源代码混在一块,看着都头疼。

首先先将src目录下的临时文件删除,只留下CMakeLists.txt,和源文件。

在src同级下建build目录,进入到build目录,

运行

cmake ../src  //../src代表工程目录,主要是找到CMakeLists


查看一下build目录,就会发现生成了一些中间文件,

然后运行 make ,就会在build目录下获得目标文件test

注意

上面我们提高过工程的两个隐藏变量,TEST_SOURCE_DIR仍然指代工程目录:src/ 。TEST_BINARY_DIR 则指代编译目录:/build/

10.添加源文件子目录

ADD_SUBDIRECTORY(src bin)  //定义src子目录加入工程,并指定编译输出路径为bin目录


这个指令用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置。

以hello world 为例

建立Hello目录,并建立子目录

Hello/src
Hello/build


在src目录下建立main.c文件,一个简单打印一句话

并在Hello目录下建立CMakeLists.txt

PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin)


并在src目录下也建立CMakeLists.txt,需要为任何子目录建立一个CMakeLists.txt

ADD_EXECUTABLE(hello main.c)


然后进入到build目录下:

cmake ..
make


构建完成后,会发现生成的目标文件位于build/bin目录中。

如果不进行bin目录的指定,那么编译结构将存在build/src目录中,指定bin目录,相当于在编译时,将src重命名为bin

11.换个地方保存目标二进制

我们可以通过SET指令重新定义EXECUTABLE_OUTPUT_PATH和LIBRARY_OUTPUT_PATH变量来指定最终的目标二进制的位置(最终生成的hello或者最终的共享库)

SET(EXECUTABLE_OUTPUT_PATH${PROJECT_BINARY_DIR}/bin)   //可执行文件的输出路径为build/bin
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) //库的输出路径为build/lib


PROJECT_BINARY_DIR在最开始我们已经说明过。

但是这些变量放在哪个CMakeLists.txt中呢?

一条原则:如果需要改变目标存放路径,在哪里ADD_EXECUTABLE或ADD_LIBRARY,就在哪里添加上述定义。本例子中当然是src目录下的txt

12.如何安装

新的cmake指令:INSTALL

变量:CMAKE_INSTALL_PREFIX 类似configure 脚本的prefix

使用方法:

cmake -DCMAKE_INSTALL_PREFIX = /usr

INSTALL 指令用于定义安装规则,安装的内容可以包含目标二进制、动态库、静态库以及文件、目录、脚本等。

INSTALL包含了各种安装类型

目标文件的安装:

INSTALL( TARGETS targets…

[[ARCHIVE]|LIBRARY| RUNTIME]

[DESTINATION]

[PERMISSIONS permissions…]

[CONFIGURATIONS [Debug | Release| …]]

[COMPONENT]

[OPTIONAL]

)

参数类型 TARGETS后面就是我们定义的目标文件,如hello ,可能是可执行二进制、动态库、静态库

目标类型有三种,ARCHIVE指静态库,LIBRARY特指动态库,RUNTIME特指可执行目标二进制。

DESTINATION定义了安装路径,如果路径是以/开头,那么指的是绝对路径,这个时候,CMAKE_INSTALL_PREFIX其实就无效了,如果你希望使用CMAKE_INSTALL_PRFIX来定义安装路径,就要写成相对路径,不要以/开头。

例子:

INSTALL(TARGETS myrun mylib mystaticlib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION libstatic
)


将可执行二进制myrun安装到

${CMAKE_INSTALL_PREFIX}/bin
目录下

动态库libmylib安装到

${CMAKE_INSTALL_PREFIX}/lib


普通文件安装:

INSTALL(FILES files...  DESTINATION
[PERMISSIONS permissions...]
[CONFIGURATIONS  [Debug | Release| ...]]
[COMPONENT]
)


用于安装一般文件,并可以指定访问权限,文件名是此指令所在路径下的相对路径,如果默认不定义权限PERMISSIONS,安装后的权限为(644)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: