cmake

    CMake主页:http://www.cmake.org/
    CMake is a family of tools designed to build, test and package software. CMake is used to control the software compilation process using simple platform and compiler independent configuration files. CMake generates native makefiles and workspaces that can be used in the compiler environment of your choice.

    以下内容参考《Cmake Practice》与官方帮助文档(http://www.cmake.org/cmake/help/v2.8.10/cmake.html#command:target_link_libraries

    cmake的主要特点:
1)开放源代码,使用类BSD许可发布
2)跨平台,并可生成native编译配置文件:
在linux/unix平台生成makefile,在max平台生成xcode,在windows平台可生成mscv的工程文件
3)能够管理大型项目,KDE4就是最好的证明
4)高效,可扩展

    基本规则:
1)文件名大小写相关
2)变量使用${}取值
3)指令大小写无关,推荐统一大写
4)注意内部编译和外部编译区别,一般的做法是:
   建立一个空的文件夹build,到该路径下编译工程目录

    cmake命令参数:

1)PROJECT(projectname [CXX] [C] [Java])
定义工程名称,并隐式的定义了两个cmake变量:
<projectname>_BINARY_DIR:指代编译路径
<projectname>_SOURCE_DIR:指代工程路径

2)cmake系统预定义了:
PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR
分别跟<projectname>_BINARY_DIR与<projectname>_SOURCE_DIR一致
建议使用这两个变量,即使工程名字改了也不需要修改这两个变量。
另,CMAKE_SOURCE_DIR也指代项目顶层目录

3)set(<variable> <value>
       [[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])
a)显示定义变量:
CMakeLists.txt中经常这样做:
先SET(var),相当于定义了内容为空的变量
再在后续中SET(var,${var},xxx.c)或者SET(var,${var},dir)

b)关于PARENT_SCOPE:If PARENT_SCOPE is present, the variable will be set in the scope above the current scope. Each new directory or function creates a new scope. This command will set the value of a variable into the parent directory or calling function (whichever is applicable to the case at hand). PARENT_SCOPE cannot be combined with CACHE.

    个人理解就是可以用PARENT_SCOPE指定变量的作用域为当前CMakeLists.txt所在目录的父目录。我简单验证了一下,即在工程目录中新建目录test_set,编写其CMakeLists.txt文件内容为:
SET(TEST_VAR test_var PARENT_SCOPE)

而在工程目录下的CMakeLists.txt文件中则添加:
ADD_SUBDIRECTORY(test_set)
MESSAGE(STATUS "TEST_VAR = " ${TEST_VAR})
编译后在屏幕输出了"TEST_VAR = test_var"。
另外一般若在当前目中下的CMakeLists.txt中用到了该变量,需将SET(TEST_VAR test_var PARENT_SCOPE)之类的语句置于文件的最后

4)MESSAGE:
向终端输出信息

5)ADD_EXECUTABLE(hello ${SRC_LIST})
定义工程会生成的可执行文件:hello(与工程名无关)

6)ADD_SUBDIRECTORY:
添加源文件子目录,并指定二进制文件存放目录

7)SUBDIRS:
添加多个子目录,不推荐用

8)修改输出路径:
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
代码放在ADD_EXECUTABLE或ADD_LIBRARY的CMakeLists文件中

9)变量CMAKE_INSTALL_PERFIX与INSTALL命令

10)ADD_LIBRARY
定义共享库target,有三种:
SHARED,动态库
STATIC,静态库
MODULE,在使用dyld的系统有效
你不需要写全libhello.so,只需要填写hello即可,cmake系统会自动为你生成libhello.X

11)SET_TARGET_PROPERTIES
设置目标属性,
设置输出文件名:SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
设置版本号:

12)GET_TARGET_PROPERTIES
获取目标属性值

13)INCLUDE_DIRECTORIES
添加特定的文件头搜索路径,路径之间用空格隔开
包含空格的路径用双引号括起来

14)LINK_DIRECTORIES和TARGET_LINK_LIBRARIES
为target添加共享库
LINK_DIRECTORIES很少用到(较明智的做法是:)
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${CMAKE_SOURCE_DIR}/lib")
FIND_LIBRARY(mylib libhello.a)
IF(mylib)
MESSAGE(STATUS "found libhello.a")
TARGET_LINK_LIBRARIES(main ${mylib})
ENDIF(mylib)
或者使用TARGET_LINK_LIBRARIES并引用绝对路径

15)BUILD_SHARED_LIBS
用来控制默认的库编译方式,如果不进行设置,ADD_LIBRARY默认生成的库是静态库

16)ADD_DEFINITIONS
向编译器添加-D定义,参数之间用空格隔开

17)AUX_SOURCE_DIRECTORY
添加指定目录下的所有源代码文件并存于一个变量中
AUX_SOURCE_DIRECTORY(. SRC_LIST)
ADD_EXECUTABLE(main ${SRC_LIST})

18)CMAKE_MINIMUM_REQUIRED
版本要求

19)EXEC_PROGRAM
在指定目录运行某程序

20)FILE
参数GLOB:将参数后符合条件的文件列表存在变量中

21)CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS
用来控制IF ELSE语句的书写方式的开关

22)INCLUDE
用来载入CMakeLists.txt( Read CMake listfile code from the given file)

23)add_custom_target: Add a target with no output so it will always be built

24)CMAKE_CURRENT_SOURCE_DIR
指的是当前处理的CMakeLists.txt所在的路径

25)CMAKE_CURRRENT_BINARY_DIR
如果是in-source编译,它跟CMAKE_CURRENT_SOURCE_DIR一致,如果是out-ofsource编译,他指的是target编译目录

cmake模块:
1)对于系统预定义的Find<name>.cmake模块
每一个模块都会定义以下几个变量
<name>_FOUND(用于判断模块是否找到)
<name>_INCLUDE_DIR or <name>_INCLUDES()
<name>_LIBRARY or <name>_LIBRARIES()

2)可以自己编写Find<name>.cmake模块
相关路径可以通过指令FIND_PATH和FIND_LIBRARY查找并保存到变量中

3)FIND_PACKAGE()
中的参数QUIEF与Find<name>.cmake模块中的<name>_FIND_QUIETLY对应
中的参数REQUIED与Find<name>.cmake模块中的<name>_FIND_REQUIED对应
可通过IF语句执行相关指令或用MESSAGE显示相关消息
REQUIED其含义是指这个共享库是否是工程必须的,如果使用了这个参数,说明这个链接库是必备库,如果找不到这个链接库,则工程不能编译。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值