sudo apt-get install cmake
这个应该是最简单的方法了,当然,你也可以去官网下载:www.cmake.org
然后运行
cmake –version 查看一下你是否安装完成
cmake好像都说比直接写Makefile牛一点,因为它可以自动生成Makefile。专门针对文件比较多的情况,要不是这几天在用别人的代码,一大堆,我觉得用Makefile也够了,但是据说Linux程序员必备技能啊,所以还是要学学这么高端的东西。
在源代码目录src中建立CMakeLists.txt文件
先介绍点常用的:
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时没有关系的,可执行文件名可以随意取。
这个意思就是#define,用一些变量来代替多次出现的一些比较繁琐的路径之类的,这个在makefile中,我们也会使用。不过是直接用“=”来定义。
set (INC_DIR /usr/local/include) //头文件路径
set (LINK_DIR /usr/local/lib) //库的路径
set (SRC_LIST main.cpp ) //源文件名称,源文件可以有多个,之间用空格隔开
set (LIB pthread Ice) //库的名称
使用${}来引用变量,但是有一个列外,在IF控制语句中,变量是直接使用变量名引用。
include_directories(${INC_DIR}) //用${} 来引用变量
link_directories(${LINK_DIR})
add_ececutable( test ${SRC_LIST}) //生成一个执行文件test,源文件来自SRC_LIST的源文件列表
target_link_libraries(test ${LIB}) //相当于是链接了-lphread -lIce
message( SATUS "this is binary dir" ${TEST_BINARY_DIR}) //输出工程所在目录
语法为message([SEND_ERROR| STATUS| FATAL_ERROR] “message”…)
SEND_ERROR,产生错误,生成过程被跳过
SATUS -,输出前缀为“—”的信息。
FATAL_ERROR,立即终止所有的cmake过程
我们上面使用的就是内部构建,就是在工程文件目录下运行cmake,然后产生一堆临时文件,和源代码混在一块,看着都头疼。
首先先将src目录下的临时文件删除,只留下CMakeLists.txt,和源文件。
在src同级下建build目录,进入到build目录,
运行
cmake ../src //../src代表工程目录,主要是找到CMakeLists
查看一下build目录,就会发现生成了一些中间文件,
然后运行 make ,就会在build目录下获得目标文件test
注意:
上面我们提高过工程的两个隐藏变量,TEST_SOURCE_DIR仍然指代工程目录:src/ 。TEST_BINARY_DIR 则指代编译目录:/build/
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
我们可以通过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
新的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)。