0%

about-cmake

Cmake 学习笔记

日期:2020/08/28

参考:github_cmake_practice

手册:cmake-practice.pdf

Cmake工具是一款很不错的跨平台项目构建工具,能够较好地解决源码基于不同平台的构建问题。在网上找到了一个入门级的cmake项目进行学习,本文记录一些学习笔记方便日后查看。


基本用法

下面是最基本的cmake使用方法,通常我们在项目根目录的CMakeLists.txt中进行如下配置:

1
2
3
4
5
6
7
8
9
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

PROJECT(Hello)

SET(SRC_LIST main.cpp)
MESSAGE(STATUS "This is some message: " ${SRC_LIST})

ADD_EXECUTABLE(hello ${SRC_LIST})
ADD_SUBDIRECTORY(src bin)

值得注意的是:

  • 为了保存源码目录的整洁性,推荐使用 外部构建 的方式,即在根目录下建立 build 目录后,将构建文件放在 build/ 目录下。

  • 为了使我们的项目更像一个工程,我们需要为项目中的特定文件建立特定的文件夹。

    • src 目录放置工程源代码,并将构建后的目标文件放入构建目录的 bin子目录

    • doc 目录放置文档文件

    • 在工程目录下分别添加 COPYRIGHTREADMErunhello.sh 等文件

    • 选择性的安装文件

      image

常用的调用方案

常用的构建+安装过程:

1
2
3
cmake -DCMAKE_INSTALL_PREFIX=/usr/tmp ..
make
make install

一些构建/安装选项:

1
2
3
4
5
6
7
make VERBOSE=1
make clean

../configure -enable-static

# lld 命令用于查看目标文件的链接情况
lld src/main

指定子目录/静态库/动态库

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
ADD_EXECUTABLE(hello main.cpp)
ADD_SUBDIRECTORY(src bin)

# 构建静态库目标以及对应属性设置
ADD_LIBRARY(hello main.cpp)
SET_TARGET_PROPERTIES(hello_static PROPERITIES OUTPUT_NAME "hello")
SET_TARGET_PROPERTIES(hello_static PROPERITIES CLEAN_DIRECT_OUTPUT 1)
GET_TARGET_PROPERTY(OUTPUT_VALUE hello_static OUTPUT_NAME)

# 构建动态库目标以及对应属性设置
ADD_LIBRARY(hello SHARED main.cpp)
SET_TARGET_PROPERTIES(hello PROPERITIES OUTPUT_NAME "hello")
SET_TARGET_PROPERTIES(hello PROPERITIES CLEAN_DIRECT_OUTPUT 1)
SET_TARGET_PROPERTIES(hello PROPERITIES VERSION 1.2 SOVERSION 1)

# 设置头文件目录
INCLUDE_DIRECTORIES(/usr/tmp/include)
FIND_PATH(myHeader hello.h)
IF(myHeader)
INCLUDE_DIRECTORIES(${myHeader})
ENDIF(myHeader)

# 链接静态/动态库文件
LINK_DIRECTORIES(/usr/tmp/lib)
TARGET_LINK_LIBRARIES(main libhello.so)
  • 注意完整的头文件、执行文件、调用库顺序为:参考博客
1
2
3
4
5
6
7
INCLUDE_DIRECTORIES(/usr/tmp/include)
LINK_DIRECTORIES(/usr/tmp/lib) # 这个一定要写在ADD_EXECUTABLE之前

ADD_EXECUTABLE(hello main.cpp)

TARGET_LINK_LIBRARIES(main libhello.so)
# 还有FIND_LIBRARY用法

安装程序

安装的过程感觉就是一种将整个项目复制到另一个指定目录,并按顺序链接好的过程。

1
2
3
4
5
6
7
8
INSTALL(TARGETS main.cpp hello hello_static
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)

INSTALL(FILES hello.h DESTINATION /usr/tmp/include)
INSTALL(PROGRAMS run_hello.sh DESTINATION /usr/tmp/bin)
INSTALL(DIRECTORY doc DESTINATION /usr/tmp/shared/doc)

常用变量

这里列举了一些常用的变量,更多的内容可以直接查阅手册:cmake-practice.pdf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 项目名称
PROJECT_NAME

# 项目构建目录
<project_name>_BINARY_DIR / CMAKE_BINARY_DIR / PROJECT_BINARY_DIR
# 项目源码目录
<project_name>_SOURCE_DIR / CMAKE_SOURCE_DIR / PROJECT_SOURCE_DIR

# 指定可执行文件和库的构建目录,最好在可执行文件和库对应目录下的CMakeLists.txt中指定
EXECUTABLE_OUTPUT_PATH
LIBRARY_OUTPUT_PATH

# 安装路径前缀,默认为 /usr/local
CMAKE_INSTALL_PREFIX

# 当前CMakeLists.txt所在文件夹的相关信息
CMAKE_CURRENT_SOURCE_DIR
CMAKE_CURRENT_LIST_DIR
CMAKE_CURRENT_BINARY_DIR

#
CMAKE_MODULE_LIST

还有两个相关的环境变量:

1
2
3
4
CMAKE_INCLUDE_PATH
CMAKE_LIBRARY)PATH

# cmake中可以通过命令$ENV{...}来进行环境变量的调用

其他

1
AUX_SOURCE_DIRECTORY(dir VARIABLE) # 查询目录下的所有文件