自动化零件服务商 - 供应SMC,FESTO,CKD全新正品气动元件
自动化零件服务商 - 供应SMC,FESTO,CKD全新正品气动元件
自动化零件服务商 - 供应SMC,FESTO,CKD全新正品气动元件

前言

cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。

正文

下面介绍常用的命令

制定cmake最小版本

  1. cmake_minimum_required(VERSION 3.4.1)
复制

这行命令是可选的,但在有些情况下,如果 CMakeLists.txt 文件中使用了一些高版本 cmake 特有的一些命令的时候,就需要加上这样一行,提醒用户升级到该版本之后再执行 cmake。

设置项目名称

  1. project(demo)
复制

这个命令不是强制性的,但最好都加上。它会引入两个变量demo_BINARY_DIR和demo_SOURCE_DIR,同时,cmake自动定义了两个等价的变量PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR。

设置编译类型

  1. add_executable(demo demo.cpp) # 生成可执行文件
  2. add_library(common STATIC util.cpp) # 生成静态库 libcommon.a
  3. add_library(common SHARED util.cpp) # 生成动态库或共享库 libcommon.so
复制

add_library默认生成的是静态库

指定编译包含哪些源文件

  1. 明确指定包含哪些源文件
  1. add_library(demo demo.cpp test.cpp util.cpp)
复制
  1. 搜索所有的cpp文件
  1. aux_source_directory(. SRC_LIST) # 搜索当前目录下的所有.cpp文件
  2. add_library(demo ${SRC_LIST})
  3. aux_source_directory(dir VAR) 发现一个目录下所有的源代码文件并将列表存储在一个变量中.
复制
  1. 自定义搜索规则
    1. file(GLOB SRC_LIST "*.cpp" "protocol/*.cpp")
    2. add_library(demo ${SRC_LIST})
    3. # 或者
    4. file(GLOB SRC_LIST "*.cpp")
    5. file(GLOB SRC_PROTOCOL_LIST "protocol/*.cpp")
    6. add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})
    7. # 或者
    8. aux_source_directory(. SRC_LIST)
    9. aux_source_directory(protocol SRC_PROTOCOL_LIST)
    10. add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})
    复制

查找指定的库文件

  1. find_library(VAR name path)查找到指定的预编译库,并将它的路径存储在变量中。
  2. 默认的搜索路径为 cmake 包含的系统库,因此如果是 NDK 的公共库只需要指定库的 name 即可。
  3. find_library(
  4. # Sets the name of the path variable.
  5. log-lib
  6. # Specifies the name of the NDK library that
  7. # you want CMake to locate.
  8. log )
复制

类似的命令还有 find_file()、find_path()、find_program()、find_package().

设置包含的目录

  1. include_directories(
  2. ${CMAKE_CURRENT_SOURCE_DIR}
  3. ${CMAKE_CURRENT_BINARY_DIR}
  4. ${CMAKE_CURRENT_SOURCE_DIR}/include
  5. )
复制

设置链接库搜索目录

  1. link_directories( ${CMAKE_CURRENT_SOURCE_DIR}/libs )
  2. Linux 下还可以通过如下方式设置包含的目录
  3. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_CURRENT_SOURCE_DIR}/libs")
复制

设置target需要链接的库

  1. target_link_libraries(
  2. # 目标库
  3. demo
  4. # 目标库需要链接的库
  5. # log-lib 是上面 find_library 指定的变量名
  6. ${log-lib} )
复制

Linux 下会搜索 xxx.so 或者 xxx.a 文件,如果都存在会优先链接动态库。

  1. 指定链接动态库或静态库
    1. target_link_libraries(demo libface.a) # 链接libface.a
    2. target_link_libraries(demo libface.so) # 链接libface.so
    复制
  2. 指定全路径
  1. target_link_libraries(demo ${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.a)
  2. target_link_libraries(demo ${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.so)
复制
  1. 指定链接多个库
    1. target_link_libraries(demo
    2. ${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.a
    3. boost_system.a
    4. boost_thread
    5. pthread)
    复制

设置变量

  1. set直接设置变量的值
  1. set(SRC_LIST main.cpp test.cpp)
  2. add_executable(demo ${SRC_LIST})
复制
  1. set追加设置变量的值
    1. set(SRC_LIST main.cpp)
    2. set(SRC_LIST ${SRC_LIST} test.cpp)
    3. add_executable(demo ${SRC_LIST})
    复制
  2. list追加或者删除变量的值
    1. set(SRC_LIST main.cpp)
    2. list(APPEND SRC_LIST test.cpp)
    3. list(REMOVE_ITEM SRC_LIST main.cpp)
    4. add_executable(demo ${SRC_LIST})
    复制

条件控制

  1. if…elseif…else…endif逻辑判断和比较:
    1. if (expression)expression 不为空(0,N,NO,OFF,FALSE,NOTFOUND)时为真
    2. if (not exp):与上面相反
    3. if (var1 AND var2)
    4. if (var1 OR var2)
    5. if (COMMAND cmd):如果 cmd 确实是命令并可调用为真
    6. if (EXISTS dir) if (EXISTS file):如果目录或文件存在为真
    7. if (file1 IS_NEWER_THAN file2):当 file1 file2 新,或 file1/file2 中有一个不存在时为真,文件名需使用全路径
    8. if (IS_DIRECTORY dir):当 dir 是目录时为真
    9. if (DEFINED var):如果变量被定义为真
    10. if (var MATCHES regex):给定的变量或者字符串能够匹配正则表达式 regex 时为真,此处 var 可以用 var 名,也可以用 ${var}
    11. if (string MATCHES regex)
    复制

    数字比较:

    1. if (variable LESS number)LESS 小于
    2. if (string LESS number)
    3. if (variable GREATER number)GREATER 大于
    4. if (string GREATER number)
    5. if (variable EQUAL number)EQUAL 等于
    6. if (string EQUAL number)
    复制

    字母表顺序比较:

    1. if (variable STRLESS string)
    2. if (string STRLESS string)
    3. if (variable STRGREATER string)
    4. if (string STRGREATER string)
    5. if (variable STREQUAL string)
    6. if (string STREQUAL string)
    复制

    实例:

    1. if(MSVC)
    2. set(LINK_LIBS common)
    3. else()
    4. set(boost_thread boost_log.a boost_system.a)
    5. endif()
    6. target_link_libraries(demo ${LINK_LIBS})
    7. # 或者
    8. if(UNIX)
    9. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fpermissive -g")
    10. else()
    11. add_definitions(-D_SCL_SECURE_NO_WARNINGS D_CRT_SECURE_NO_WARNINGS
    12. -D_WIN32_WINNT=0x601 -D_WINSOCK_DEPRECATED_NO_WARNINGS)
    13. endif()
    14. if(${CMAKE_BUILD_TYPE} MATCHES "debug")
    15. ...
    16. else()
    17. ...
    18. endif()
    复制
    1. while…endwhile
    1. while(condition)
    2. ...
    3. endwhile()
    复制
    1. foreach…endforeach
    1. foreach(loop_var RANGE start stop [step])
    2. ...
    3. endforeach(loop_var)
    复制

    start 表示起始数,stop 表示终止数,step 表示步长,示例:

    1. foreach(i RANGE 1 9 2)
    2. message(${i})
    3. endforeach(i)
    4. # 输出:13579
    复制

打印信息

  1. message(${PROJECT_SOURCE_DIR})
  2. message("build with debug mode")
  3. message(WARNING "this is warnning message")
  4. message(FATAL_ERROR "this build has many error") # FATAL_ERROR 会导致编译失败
复制

包含其他cmake文件

  1. include(./common.cmake) # 指定包含文件的全路径
  2. include(def) # 在搜索路径中搜索def.cmake文件
  3. set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) # 设置include的搜索路径
复制

参考文章

  1. CMakeLists.txt常用语法 – 简书 (jianshu.com)
  2. CMakeLists.txt常用语法_SSS_369的博客-CSDN博客
自动化零件服务商 - 供应SMC,FESTO,CKD全新正品气动元件

相关文章

自动化零件服务商 - 供应SMC,FESTO,CKD全新正品气动元件

暂无评论

none
暂无评论...