cmake和Makefile的关系

cmake 就是用来产生 Makefile 的工具,解析 CMakeLists.txt 自动生成 Makefile

安装cmake:

方法一:

apt install cmake

方法二:源码安装

http://www.cmake.org/cmake/resources/software.html
#tar -xvf cmake-3.22.0-rc2.tar.gz        
#cd cmake-3.22.0-rc2
#./bootstrap
#make
#make install

cmake官方教程

https://cmake.org/cmake/help/latest/guide/tutorial/index.html

cmake 会默认安装在 /usr/local/bin 下面

cmake简单使用

1、创建hello目录 #mkdir hello
2、#cd hello 创建main.c
3、在hello目录下创建CMakeLists.txt:

#cmake最低版本需求,不加入此行会受到警告信息
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(HELLO) #项目名称
#把当前目录(.)下所有源代码文件和头文件加入变量SRC_LIST
AUX_SOURCE_DIRECTORY(. SRC_LIST)
#生成应用程序 hello
ADD_EXECUTABLE(hello ${SRC_LIST})

4、为了使用外部编译方式编译项目在hello目录下创建build目录
5、#cd bulid 执行 cmake …
6、#make 生成hello

处理多源文件方法

cmake安装python cmake如何安装_linux


src目录下的文件要编译成一个链接库

1、在step2目录中创建CMakeLists.txt:

PROJECT(main)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6) 
ADD_SUBDIRECTORY( src ) #指明本项目包含一个src子目录
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
ADD_EXECUTABLE(main ${DIR_SRCS}  )
TARGET_LINK_LIBRARIES( main Test )  #可执行文件main需要链接一个名为Test的链接库

2、在子目录src中创建CMakeLists.txt:

AUX_SOURCE_DIRECTORY(. DIR_TEST1_SRCS)
ADD_LIBRARY ( Test ${DIR_TEST1_SRCS}) #将scr目录中的子文件编译成共享库

3、在step2目录中执行

cmake .
make

设置交叉编译器

# 配置 ARM 交叉编译

set(CMAKE_SYSTEM_NAME Linux) #设置目标系统名字

set(CMAKE_SYSTEM_PROCESSOR arm) #设置目标处理器架构

# 指定编译器的 sysroot 路径

set(TOOLCHAIN_DIR /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots)

set(CMAKE_SYSROOT ${TOOLCHAIN_DIR}/cortexa7hf-neon-poky-linux-gnueabi)

# 指定交叉编译器 arm-gcc 和 arm-g++

set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc)

set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-g++)
# 为编译器添加编译选项

set(CMAKE_C_FLAGS "-march=armv7ve -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a7")

set(CMAKE_CXX_FLAGS "-march=armv7ve -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a7")

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)

set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

使用交叉编译器

cmake -DCMAKE_TOOLCHAIN_FILE=./arm-linux-setup.cmake ..

cmake常用命令

add_executable 			可执行程序目标
add_library 			库文件目标
add_subdirectory 		去指定目录中寻找新的 CMakeLists.txt 文件
aux_source_directory 	收集目录中的文件名并赋值给变量
cmake_minimum_required 	设置 cmake 的最低版本号要求
get_target_property 	获取目标的属性
include_directories 	设置所有目标头文件的搜索路径,相当于 gcc 的-I 选项
link_directories 		设置所有目标库文件的搜索路径,相当于 gcc 的-L 选项
link_libraries 			设置所有目标需要链接的库
list 					列表相关的操作
message 				用于打印、输出信息
project 				设置工程名字
set 					设置变量
set_target_properties 	设置目标属性
target_include_directories 设置指定目标头文件的搜索路径
target_link_libraries 	设置指定目标库文件的搜索路径
target_sources 			设置指定目标所需的源文件

cmake常用变量

提供信息的变量

PROJECT_SOURCE_DIR 			工程顶层目录,也就是顶层 CMakeLists.txt 源码所在目录
PROJECT_BINARY_DIR 			工 程 BINARY_DIR , 也 就 是 顶 层 CMakeLists.txt 源码的BINARY_DIR
CMAKE_SOURCE_DIR 与 PROJECT_SOURCE_DIR 等价
CMAKE_BINARY_DIR 与 PROJECT_BINARY_DIR 等价
CMAKE_CURRENT_SOURCE_DIR 	当前源码所在路径
CMAKE_CURRENT_BINARY_DIR 	当前源码的 BINARY_DIR
CMAKE_MAJOR_VERSION 		cmake 的主版本号
CMAKE_MINOR_VERSION 		cmake 的次版本号
CMAKE_VERSION 				cmake 的版本号(主+次+修订)
PROJECT_VERSION_MAJOR 		工程的主版本号
PROJECT_VERSION_MINOR 		工程的次版本号
PROJECT_VERSION 			工程的版本号
CMAKE_PROJECT_NAME 			工程的名字
PROJECT_NAME 				工程名,与 CMAKE_PROJECT_NAME 等价

改变行为的变量

BUILD_SHARED_LIBS 			控制 cmake 是否生成动态库
CMAKE_BUILD_TYPE 			指定工程的构建类型,release 或 debug
CMAKE_SYSROOT 				对应编译器的在--sysroot 选项
CMAKE_IGNORE_PATH 			设置被 find_xxx 命令忽略的目录列表
CMAKE_INCLUDE_PATH 			为 find_file()和 find_path()命令指定搜索路径的目录列表
CMAKE_INCLUDE_DIRECTORIES_BEFORE 用于控制 include_directories()命令的行为
CMAKE_LIBRARY_PATH 			指定 find_library()命令的搜索路径的目录列表
CMAKE_MODULE_PATH 			指定要由 include()或 find_package()命令加载的CMake 模块的搜索路径的目录列表
CMAKE_PROGRAM_PATH 			指定 find_program()命令的搜索路径的目录列表

描述系统的变量

CMAKE_HOST_SYSTEM_NAME 			运行 cmake 的操作系统的名称(其实就是 uname -s)
CMAKE_HOST_SYSTEM_PROCESSOR 	运行 cmake 的操作系统的处理器名称(uname -p)
CMAKE_HOST_SYSTEM 				运行 cmake 的操作系统(复合信息)
CMAKE_HOST_SYSTEM_VERSION 		运行 cmake 的操作系统的版本号(uname -r)
CMAKE_HOST_UNIX 				如果运行 cmake 的操作系统是 UNIX 和类 UNIX,则该变量为 true,否则是空值
CMAKE_HOST_WIN32 				如果运行 cmake 的操作系统是 Windows,则该变量为 true,否则是空值
CMAKE_SYSTEM_NAME 				目标主机操作系统的名称
CMAKE_SYSTEM_PROCESSOR 			目标主机的处理器名称
CMAKE_SYSTEM 					目标主机的操作系统(复合信息)
CMAKE_SYSTEM_VERSION 目			标主机操作系统的版本号
ENV 							用于访问环境变量
UNIX 							与 CMAKE_HOST_UNIX 等价
WIN32 							与 CMAKE_HOST_WIN32 等价