安装

https://graspingtech.com/upgrade-cmake/

1、使用包管理器

sudo apt安装的版本比较低

还有一个snappy包管理器,直接安装最新的版本,不过我还没用过

  1. sudo snap install cmake --classic

2、从源代码安装

时间会比较长,但没什么依赖问题

  1. sudo apt install build-essential libssl-dev
  2. wget https://github.com/Kitware/CMake/releases/download/v3.20.2/cmake-3.20.2.tar.gz
  3. tar -zxvf cmake-3.20.2.tar.gz
  4. cd cmake-3.20.2
  5. ./bootstrap
  6. make
  7. sudo make install

报错:could not find openssl

  1. sudo apt-get install libssl-dev

cmake —version发现还是旧版本,或者报错:/usr/bin/cmake: No such file or directory

  • (先卸载旧版本)
  1. sudo apt remove --purge cmake
  2. hash -r #不懂,没加这个也没问题
  • 因为直接使用cmake, 系统默认去/usr/bin中去寻找,但是src中安装的cmake是在/usr/local/bin中,所以建立个软连接就好了
  1. sudo ln -s /usr/local/bin/cmake /usr/bin

实例

  1. 作者:fddfdafd
  2. 链接:https://zhuanlan.zhihu.com/p/409257749
  3. 来源:知乎
  4. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  5. 1、指定 cmake 的最小版本
  6. cmake_minimum_required(VERSION 3.4.1)
  7. 2、设置项目名称,它会引入两个变量 demo_BINARY_DIR demo_SOURCE_DIR,同时,cmake 自动定义了两个等价
  8. 的变量 PROJECT_BINARY_DIR PROJECT_SOURCE_DIR
  9. project(demo)
  10. 3、设置编译类型,add_library 默认生成是静态库
  11. add_executable(demo demo.cpp) # 生成可执行文件
  12. add_library(common STATIC util.cpp) # 生成静态库
  13. add_library(common SHARED util.cpp) # 生成动态库或共享库
  14. 以上命令将生成:
  15. Linux 下是:
  16. demo
  17. libcommon.a
  18. libcommon.so
  19. Windows 下是:
  20. demo.exe
  21. common.lib
  22. common.dll
  23. 4、明确指定包含哪些源文件
  24. add_library(demo demo.cpp test.cpp util.cpp)
  25. 5、设置变量
  26. 5.1 set 直接设置变量的值
  27. set(SRC_LIST main.cpp test.cpp)
  28. add_executable(demo ${SRC_LIST})
  29. set(ROOT_DIR ${CMAKE_SOURCE_DIR}) #CMAKE_SOURCE_DIR默认为当前cmakelist.txt目录
  30. 5.2 set追加设置变量的值
  31. set(SRC_LIST main.cpp)
  32. set(SRC_LIST ${SRC_LIST} test.cpp)
  33. add_executable(demo ${SRC_LIST})
  34. 5.3 list追加或者删除变量的值
  35. set(SRC_LIST main.cpp)
  36. list(APPEND SRC_LIST test.cpp)
  37. list(REMOVE_ITEM SRC_LIST main.cpp)
  38. add_executable(demo ${SRC_LIST})
  39. 6、搜索文件
  40. 6.1 搜索当前目录下的所有.cpp文件,并命名为SRC_LIST,它会查找目录下的.c,.cpp ,.mm,.cc 等等C/C++语言后缀的文件名
  41. aux_source_directory(. SRC_LIST)
  42. add_library(demo ${SRC_LIST})
  43. 6.2 自定义搜索规则
  44. aux_source_directory(. SRC_LIST)
  45. aux_source_directory(protocol SRC_PROTOCOL_LIST)
  46. add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})
  47. 或者
  48. file(GLOB SRC_LIST "*.cpp" "protocol/*.cpp")
  49. add_library(demo ${SRC_LIST})
  50. # 或者
  51. file(GLOB SRC_LIST "*.cpp")
  52. file(GLOB SRC_PROTOCOL_LIST "protocol/*.cpp")
  53. add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})
  54. # 或者
  55. file(GLOB_RECURSE SRC_LIST "*.cpp") #递归搜索
  56. FILE(GLOB SRC_PROTOCOL RELATIVE "protocol" "*.cpp") # 相对protocol目录下搜索
  57. add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})
  58. 7、设置包含的目录,头文件目录
  59. include_directories(
  60. ${CMAKE_CURRENT_SOURCE_DIR}
  61. ${CMAKE_CURRENT_BINARY_DIR}
  62. ${CMAKE_CURRENT_SOURCE_DIR}/include
  63. )
  64. Linux 下还可以通过如下方式设置包含的目录
  65. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}")
  66. 8、设置链接库搜索目录
  67. link_directories(
  68. ${CMAKE_CURRENT_SOURCE_DIR}/libs
  69. )
  70. Linux 下还可以通过如下方式设置包含的目录
  71. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_CURRENT_SOURCE_DIR}/libs")
  72. 9、设置 target 需要链接的库
  73. 9.1 指定链接动态库或静态库
  74. target_link_libraries(demo libface.a) # 链接libface.a
  75. target_link_libraries(demo libface.so) # 链接libface.so
  76. 9.2 指定全路径
  77. target_link_libraries(demo ${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.a)
  78. target_link_libraries(demo ${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.so)
  79. 9.3 指定链接多个库
  80. target_link_libraries(demo
  81. ${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.a
  82. boost_system.a
  83. boost_thread
  84. pthread)
  85. 10、打印信息
  86. message(${PROJECT_SOURCE_DIR})
  87. message("build with debug mode")
  88. message(WARNING "this is warnning message")
  89. message(FATAL_ERROR "this build has many error") # FATAL_ERROR 会导致编译失败
  90. 11.包含其它 cmake 文件
  91. include(./common.cmake) # 指定包含文件的全路径
  92. include(def) # 在搜索路径中搜索def.cmake文件
  93. set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) # 设置include的搜索路径
  94. 12、条件控制
  95. 12.1 ifelseifelseendif
  96. 逻辑判断和比较:
  97. if (expression):expression 不为空(0,N,NO,OFF,FALSE,NOTFOUND)时为真
  98. if (not exp):与上面相反
  99. if (var1 AND var2)
  100. if (var1 OR var2)
  101. if (COMMAND cmd):如果 cmd 确实是命令并可调用为真
  102. if (EXISTS dir) if (EXISTS file):如果目录或文件存在为真
  103. if (file1 IS_NEWER_THAN file2):当 file1 file2 新,或 file1/file2 中有一个不存在时为真,文件名需使用全路径
  104. if (IS_DIRECTORY dir):当 dir 是目录时为真
  105. if (DEFINED var):如果变量被定义为真
  106. if (var MATCHES regex):给定的变量或者字符串能够匹配正则表达式 regex 时为真,此处 var 可以用 var 名,也可以用 ${var}
  107. if (string MATCHES regex)
  108. 数字比较:
  109. if (variable LESS number):LESS 小于
  110. if (string LESS number)
  111. if (variable GREATER number):GREATER 大于
  112. if (string GREATER number)
  113. if (variable EQUAL number):EQUAL 等于
  114. if (string EQUAL number)
  115. 字母表顺序比较:
  116. if (variable STRLESS string)
  117. if (string STRLESS string)
  118. if (variable STRGREATER string)
  119. if (string STRGREATER string)
  120. if (variable STREQUAL string)
  121. if (string STREQUAL string)
  122. 12.2 whileendwhile
  123. 12.3 foreachendforeach
  124. foreach(i RANGE 1 9 2)
  125. message(${i})
  126. endforeach(i)
  127. # 输出:13579
  128. 13、常用变量
  129. 13.1 预定义变量
  130. PROJECT_SOURCE_DIR:工程的根目录
  131. PROJECT_BINARY_DIR:运行 cmake 命令的目录,通常是 ${PROJECT_SOURCE_DIR}/build
  132. PROJECT_NAME:返回通过 project 命令定义的项目名称
  133. CMAKE_CURRENT_SOURCE_DIR:当前处理的 CMakeLists.txt 所在的路径
  134. CMAKE_CURRENT_BINARY_DIRtarget 编译目录
  135. CMAKE_CURRENT_LIST_DIRCMakeLists.txt 的完整路径
  136. CMAKE_CURRENT_LIST_LINE:当前所在的行
  137. CMAKE_MODULE_PATH:定义自己的 cmake 模块所在的路径,SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令来调用自己的模块
  138. EXECUTABLE_OUTPUT_PATH:重新定义目标二进制可执行文件的存放位置
  139. LIBRARY_OUTPUT_PATH:重新定义目标链接库文件的存放位置
  140. 13.2 环境变量
  141. $ENV{Name}
  142. set(ENV{Name} value) # 这里没有“$”符号
  143. 13.3 系统信息
  144. CMAKE_MAJOR_VERSIONcmake 主版本号,比如 3.4.1 中的 3
  145. ­CMAKE_MINOR_VERSIONcmake 次版本号,比如 3.4.1 中的 4
  146. ­CMAKE_PATCH_VERSIONcmake 补丁等级,比如 3.4.1 中的 1
  147. ­CMAKE_SYSTEM:系统名称,比如 Linux2.6.22
  148. ­CMAKE_SYSTEM_NAME:不包含版本的系统名,比如 Linux
  149. ­CMAKE_SYSTEM_VERSION:系统版本,比如 2.6.22
  150. ­CMAKE_SYSTEM_PROCESSOR:处理器名称,比如 i686
  151. ­UNIX:在所有的类 UNIX 平台下该值为 TRUE,包括 OS X cygwin
  152. ­WIN32:在所有的 win32 平台下该值为 TRUE,包括 cygwin
  153. 14、主要开关选项
  154. BUILD_SHARED_LIBS:这个开关用来控制默认的库编译方式,如果不进行设置,使用 add_library 又没有指定库类型的情况下,默认编译生成的库都是静态库。如果 set(BUILD_SHARED_LIBS ON) 后,默认生成的为动态库
  155. CMAKE_C_FLAGS:设置 C 编译选项,也可以通过指令 add_definitions() 添加
  156. CMAKE_CXX_FLAGS:设置 C++ 编译选项,也可以通过指令 add_definitions() 添加
  157. add_definitions(-DENABLE_DEBUG -DABC) # 参数之间用空格分隔