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
处理多源文件方法
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 等价