1 前言
最近由于项目中需要用到三方库交叉编译,自学了Cmake,并进行了基础知识的总结,更详细的内容可以操控下面的链接。
参考文档:https://www.yuque.com/docs/share/d66b3695-cd45-43ca-bb3f-87f51ae589a6?# ;《CMake实战》
2 编译安装
最简单的就是命令安装:
apt-get install cmake
如果需要比较新的版本可以采用源码安装:
网络不是太好的可以github下载源码
wget https://cmake.org/files/v3.21/cmake-3.21.4-Linux-x86_64.tar.gz
tar zxvf cmake-3.21.4-Linux-x86_64.tar.gz
mv cmake-3.21.4-Linux-x86_64 /opt/cmake-3.21.4
ln -sf /opt/cmake-3.21.4/bin/* /usr/bin/
3 基本语法
cmake中关键字不区分大小写
#最小版本约定
cmake_minimum_required(VERSION 2.8)
#工程名称:不是执行文件名
PROJECT(projectname [CXX] [C] [Java])
#设置变量
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
#消息打印
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)
#生成执行文件
ADD_EXECUTABLE([BINARY] [SOURCE_LIST])
#添加子目录
ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
#安装
#默认/usr/local/
#指定自定义安装目录,如 cmake -DCMAKE_INSTALL_PREFIX=/home/usr ..
#INSTALL的类型比较多
INSTALL(TARGETS <target>... [...])
INSTALL({FILES | PROGRAMS} <file>... [...])
INSTALL(DIRECTORY <dir>... [...])
INSTALL(SCRIPT <file> [...])
INSTALL(CODE <code> [...])
INSTALL(EXPORT <export-name> [...])
#添加头文件路径
INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/include")
#添加库文件路径
LINK_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/lib")
#生成库文件
ADD_LIBRARY( hello_shared SHARED libhello.cpp ) # 生成动态库
ADD_LIBRARY( hello_shared STATIC libHello.cpp ) 生成静态库
#链接库到执行文件上
TARGET_LINK_LIBRARIES(demo lib1 lib2)
#找在某个路径下的所有源文件,放到变量中
aux_source_directory(<dir> <variable>)
4 基本定义
#工程编译发生的目录
CMAKE_BINARY_DIR
#工程顶层目录
CMAKE_SOURCE_DIR
#当前目录
CMAKE_CURRENT_SOURCE_DIR
#变量用来定义自己的cmake 模块所在的路径
CMAKE_MODULE_PATH
#编译执行文件输出位置
EXECUTABLE_OUTPUT_PATH
#编译库输出位置
LIBRARY_OUTPUT_PATH
#头文件路径
CMAKE_INCLUDE_PATH
#库文件路径
CMAKE_LIBRARY_PATH
#C编译选项
CMAKE_C_FLAGS
#C++编译选项
CMAKE_CXX_FLAGS
5 调用库
同时静态库、动态库 优先连接动态库,动态库只需要指定lib名称匹配即可;强制指定动态库需要利用全名才行如libhello.a
# 引用动态库
ADD_EXECUTABLE(demo ${SRC_LIST})
#同时静态库、动态库 优先连接动态库
#TARGET_LINK_LIBRARIES(demo Dir1)
# 强制使用静态库
TARGET_LINK_LIBRARIES(demo libDir1.a)
6 编译debug版本release版本
一般情况下项目对于发行文件有更高的编译等级要求,同时需要去掉一些调试信息和符号要求。需要区分调试版本和发行版本。
编译debug版本
cmake -DCMAKE_BUILD_TYPE=Debug …
编译release版本
cmake -DCMAKE_BUILD_TYPE=Release …
# 设置release版本还是debug版本
if(${CMAKE_BUILD_TYPE} MATCHES "Release")
message(STATUS "Release版本")
set(BuildType "Release")
SET(CMAKE_C_FLAGS "$ENV{CFLAGS} -DNODEBUG -O3 -Wall")
SET(CMAKE_CXX_FLAGS "$ENV{CXXFLAGS} -DNODEBUG -O3 -Wall")
MESSAGE(STATUS "CXXFLAGS: " ${CMAKE_CXX_FLAGS})
MESSAGE(STATUS "CFLAGS: " ${CMAKE_C_FLAGS})
else()
set(BuildType "Debug")
message(STATUS "Debug版本")
SET(CMAKE_CXX_FLAGS "$ENV{CXXFLAGS} -Wall -O0 -g")
# SET(CMAKE_C_FILAGS "-O0 -g")
SET(CMAKE_C_FLAGS "$ENV{CFLAGS} -O0 -g")
MESSAGE(STATUS "CXXFLAGS: " ${CMAKE_CXX_FLAGS})
MESSAGE(STATUS "CFLAGS: " ${CMAKE_C_FILAGS})
endif()