安装
命令行安装
apt-get update && apt-get -y install cmake
源码安装
版本
3.15.0
地址
https://github.com/Kitware/CMake/releases/tag/v3.15.0
文件包
cmake-3.15.0-Linux-x86_64.sh
在终端执行以下操作
sudo apt remove cmake
chmod +x /opt/cmake-3.15.0-Linux-x86_64.sh
bash /opt/cmake-3.15.0-Linux-x86_64.sh ##出现提示,按y
ln -s /opt/cmake-3.15.0-Linux-x86_64.sh /usr/local/bin
cmake --version
安装成功
实战使用
编写一个打印测试程序,此程序依赖一个自研的动态库,整个项目通过cmake进行编译。
完整demo源码链接:https://github.com/zouyingquan/cmake_sample
cmake_minimum_required(VERSION 3.5)
project(sample)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_INSTALL_RPATH "./")
set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/bin)
set(CMAKE_INSTALL_RPATH ${CMAKE_CURRENT_SOURCE_DIR}/3rd/lib)
message("print your test message")
message(${CMAKE_INSTALL_PREFIX})
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/3rd)
#find_library(PRINT_LIB print ${CMAKE_CURRENT_SOURCE_DIR}/3rd/lib)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rd/lib)
add_executable(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp)
target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/3rd/src)
target_link_libraries(${PROJECT_NAME} print)
#target_link_libraries(${PROJECT_NAME} ${PRINT_LIB})
INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX})
语法
本文根据demo,对cmake的相关语法进行解释,详细的cmake说明请参考官方文档:https://cmake.org/cmake/help/latest/manual/cmake-commands.7.html
不同版本的cmake语法上大同小异,任意选择一个版本学习即可
CMAKE_INSTALL_RPATH
: 设置运行是库链接路径(与gcc -rpath 效果一致),在本demo中,libprint.so在${CMAKE_CURRENT_SOURCE_DIR}/3rd/lib
这个目录下,如果不设置rpath,则需要把库的绝对路径加入环境变量
message
:输出变量值,在复杂的项目中,可以用来调试打印cmake的信息
add_subdirectory
: 进入到${CMAKE_CURRENT_SOURCE_DIR}/3rd
,根据这个目录下的CMakelist.txt进行编译。通常项目上需要功能模块是分开的,每个模块可以单独编译,可以使用此方法实现项目一步到位编译构建。
target_link_libraries
: Specify libraries or flags to use when linking a given target and/or its dependents。指定链接库
编译链接库选项
- 方法一:
find_library
This command is used to find a library。示例中,在${CMAKE_CURRENT_SOURCE_DIR}/3rd/lib 中找到libprint.so,PRINT_LIB
的值就是libprint.so的绝对路径。 - 方法二:
link_directories
Adds the paths in which the linker should search for libraries.添加库的搜索路径。但这里有需要主要的是,要使得这个这个命令生效,需要写在add_executable
add_library
这些命令之前。在官方文档中强调了这个命令的使用方式The command will apply only to targets created after it is called
。通常link_directories
不生效,往往是因为写在了targets之后
安装
cmake提供了安装的操作,将编译出来的目标文件安装到制定目录。INSTALL
支持以下操作
install(TARGETS <target>... [...])
install(IMPORTED_RUNTIME_ARTIFACTS <target>... [...])
install({FILES | PROGRAMS} <file>... [...])
install(DIRECTORY <dir>... [...])
install(SCRIPT <file> [...])
install(CODE <code> [...])
install(EXPORT <export-name> [...])
install(RUNTIME_DEPENDENCY_SET <set-name> [...])
不同的文件类型建议使用相对应的命令,例如:
- 安装文件,使用
install(FILES )
- 安装脚本文件,使用
install(PROGRAMS)
这将会默认保留文文件原本的权限 - 安装整个目录,使用
install(DIRECTORY )