cmake学习

参考:

  1. sewm.pku.edu.cn/src/paradise/reference/CMake%20Practice.pdf
  2. https://www.cnblogs.com/ph829/p/4759124.html
  3. http://www.hahack.com/codes/cmake/:
  4. http://v.youku.com/v_show/id_XMjc1MjE0MjEwNA==.html

PROJECT 指令的语法是:

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

声明工程

SET 指令的语法是:

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

显示的定义变量

MESSAGE 指令的语法是:

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

…)
这个指令用于向终端输出用户定义的信息,包含了三种类型:
SEND_ERROR,产生错误,生成过程被跳过。
STATUS,输出前缀为—的信息。
FATAL_ERROR,立即终止所有 cmake 过程

ADD_EXECUTABLE(hello ${SRC_LIST})

定义了这个工程会生成一个文件名为 hello 的可执行文件,相关的源文件是 SRC_LIST 中定义的源文件列。

ADD_SUBDIRECTORY 指令

ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

这个指令用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置。EXCLUDE_FROM_ALL 参数的含义是将这个目录从编译过程中排除,比如,工程的 example,可能就需要工程构建完成后,再进入 example 目录单独进行构建(当然,你也可以通过定义依赖来解决此类问题)。

目标文件的安装:

INSTALL(TARGETS targets...
    [[ARCHIVE|LIBRARY|RUNTIME]
    [DESTINATION <dir>]
    [PERMISSIONS permissions...]
    [CONFIGURATIONS
    [Debug|Release|...]]
    [COMPONENT <component>]
    [OPTIONAL]
     ] [...])

举个简单的例子:
INSTALL(TARGETS myrun mylib mystaticlib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION libstatic
)
上面的例子会将:
可执行二进制 myrun 安装到${CMAKE_INSTALL_PREFIX}/bin 目录
动态库 libmylib 安装到${CMAKE_INSTALL_PREFIX}/lib 目录
静态库 libmystaticlib 安装到${CMAKE_INSTALL_PREFIX}/libstatic 目录

ADD_LIBRARY

ADD_LIBRARY(libname [SHARED|STATIC|MODULE]
       [EXCLUDE_FROM_ALL]
       source1 source2 ... sourceN)

INCLUDE_DIRECTORIES

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

这条指令可以用来向工程添加多个特定的头文件搜索路径,路径之间用空格分割,如果路径中包含了空格,可以使用双引号将它括起来,默认的行为是追加到当前的头文件搜索路径的后面,你可以通过两种方式来进行控制搜索路径添加的方式:
1,CMAKE_INCLUDE_DIRECTORIES_BEFORE,通过 SET 这个 cmake 变量为 on,可以将添加的头文件搜索路径放在已有路径的前面。
2,通过 AFTER 或者 BEFORE 参数,也可以控制是追加还是置前。

LINK_DIRECTORIES(directory1 directory2 …)
这个指令非常简单,添加非标准的共享库搜索路径,比如,在工程内部同时存在共享库和可执行二进制,在编译时就需要指定一下这些共享库的路径。

TARGET_LINK_LIBRARIES(target library1 library2…)
这个指令可以用来为 target 添加需要链接的共享库,本例中是一个可执行文件,但是同样可以用于为自己编写的共享库添加共享库链接。

举例

VMProber用到 wxWidgets / capstone / libvmi 进行关联
文件目录
VMProber
–src
–include
–build

CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#指名最小版本号
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
#设置项目名称
PROJECT(VMProber)
#设置源文件夹
AUX_SOURCE_DIRECTORY(./src SRC_LIST)
#关联目标文件
ADD_EXECUTABLE(VMProber ${SRC_LIST} )

##########库##################
#wxWidgets
FIND_PACKAGE(wxWidgets REQUIRED)
INCLUDE(${wxWidgets_USE_FILE})

#libvmi
INCLUDE_DIRECTORIES(/libvmi/libvmi-0.10.1 )
LINK_DIRECTORIES(/libvmi/libvmi-0.10.1/libvmi/.libs)

#capstone
TARGET_LINK_LIBRARIES(VMProber
m glib-2.0 dl
capstone
libvmi.so
wx_gtk2u_aui-3.0
wx_gtk2u_xrc-3.0
wx_gtk2u_html-3.0
wx_gtk2u_qa-3.0
wx_gtk2u_adv-3.0
wx_gtk2u_core-3.0
wx_baseu_xml-3.0
wx_baseu_net-3.0
wx_baseu-3.0 )
#设置目标文件输出路径,外部编译
SET(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/bin")#CMAKE_BINARY_DIR指编译路径,就是执行cmake的当前路径