• 定义

    CMake是一种跨平台编译工具,CMake主要是编写CMakeLists.txt文件,然后通过cmake命令将CMakeLists.txt文件转化为make所需要的Makefile文件,最后用make命令编译源码生成可执行程序或者库文件。

  • 语法规则

    指令是大小写无关的,参数和变量是大小写相关的

    • CMakeLists.txt常见指令
      1、cmake_minimum_required(VERSION 2.6)命令
      #指定CMake编译最低要求版本
      例:CMAKE_MINIMUM_REQUIRED(VERSION 3.14)

      2、PROJECT(<projectname>)命令
      #给项目命名
      PROJECT(TEST)

      3、ADD_SUBDIRECTORY命令
      #该命令告诉CMake去子目录中查看可用的CMakeLists.txt文件

      4、ADD_EXECUTABLE命令
      #将hello.cpp生成可执行文件hello
      ADD_EXECUTABLE(hello ${SOURCE})

      5、ADD_LIBRARY命令
      #变量SRC_LIST_CPP 与SRC_LIST_C 指定生成test动态库 默认生成静态库 SHARED指定生成库类型为动态库
      ADD_LIBRARY(test SHARED ${SRC_LIST_CPP} ${SRC_LIST_C})
      ADD_LIBRARY(test STATIC util.cpp) # 生成静态库

      6、FILE命令
      #收集c/c++文件并赋值给变量SRC_LIST_CPP ${PROJECT_SOURCE_DIR}代表区当前项目录
      FILE(GLOB SRC_LIST_CPP ${PROJECT_SOURCE_DIR}/src/*.cpp)

      7、INCLUDE_DIRECTORIES命令
      #指定头文件目录
      INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)

      8、LINK_DIRECTORIES命令
      #指定链接库文件目录
      LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib)

      9、TARGET_LINK_LIBRARIES命令
      #指定hello 链接库test
      TARGET_LINK_LIBRARIES(hello test)

      10、AUX_SOURCE_DIRECTORY命令
      #AUX_SOURCE_DIRECTORY(dir VAR) 发现一个目录下所有的源代码文件并将列表存储在一个变量中
      AUX_SOURCE_DIRECTORY(. SRC_LIST) # 搜索当前目录下的所有.cpp文件,放到SRC_LIST变量中

      8、SET命令
      #用来显式的定义变量
      例子:
      #用变量代替值,例子中定义SRC_LST代替后面的字符串
      SET (SRC_LST main.c test.c)
      #指定生成库文件的目录
      SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

      • 常用变量
      变量名 含义
      JECT_NAME project命令中写的项目名
      KE_VERSION 当前使用CMake的版本
      KE_SOURCE_DIR 工程顶层目录,即入口CMakeLists文件所在路径
      JECT_SOURCE_DIR 同CMAKE_SOURCE_DIR
      KE_BINARY_DIR 工程编译发生的目录,即执行cmake命令进行项目配置的目录,一般为build
      JECT_BINARY_DIR 同CMAKE_BINARY_DIR
      KE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在的路径
      KE_CURRRENT_BINARY_DIR 当前处理的CMakeLists.txt中生成目标文件所在编译目录
      KE_CURRENT_LIST_FILE 输出调用这个变量的CMakeLists.txt文件的完整路径
      KE_CURRENT_LIST_DIR 当前处理的CMakeLists.txt文件所在目录的路径
      KE_INSTALL_PREFIX 指定make install命令执行时包安装路径
      KE_MODULE_PATH find_package命令搜索包路径之一,默认为空
      KE_BUILD_TYPE 编译选项,Release或者Debug,如set(CMAKE_BUILD_TYPE “Release”)
      KE_CXX_FLAGS 编译标志,设置C++11编译,set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -std=c++11”)
  • 例子

#指定CMake编译最低要求版本3.6
cmake_minimum_required(VERSION 3.6)#CMAKE_BUILD_TYPE 代替后面的字符串RelWithDebInfo CACHE STRING "build type"
set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "build type")#给项目命名tutorial
project(tutorialLANGUAGES C CXX
)#CMAKE_RUNTIME_OUTPUT_DIRECTORY 代替后面的字符串${PROJECT_SOURCE_DIR}
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR})if(ANDROID)#指定链接库文件目录${OPENSSL_LINK_DIR}link_directories(${OPENSSL_LINK_DIR})
else()find_library(LIBRT rt)find_package(OpenSSL REQUIRED)
endif()
find_package(workflow REQUIRED CONFIG HINTS ..)
#指定头文件目录${OPENSSL_INCLUDE_DIR} ${WORKFLOW_INCLUDE_DIR}
include_directories(${OPENSSL_INCLUDE_DIR} ${WORKFLOW_INCLUDE_DIR})
#指定链接库文件目录${WORKFLOW_LIB_DIR}
link_directories(${WORKFLOW_LIB_DIR})if (KAFKA STREQUAL "y")find_path(SNAPPY_INCLUDE_PATH NAMES snappy.h)#指定头文件目录${SNAPPY_INCLUDE_PATH}include_directories(${SNAPPY_INCLUDE_PATH})
endif ()if (WIN32)set(CMAKE_C_FLAGS   "${CMAKE_C_FLAGS}   /MP /wd4200")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /wd4200 /std:c++14")
else ()#CMAKE_C_FLAGS代替后面的字符串"${CMAKE_C_FLAGS}   -Wall -fPIC -pipe -std=gnu90"set(CMAKE_C_FLAGS   "${CMAKE_C_FLAGS}   -Wall -fPIC -pipe -std=gnu90")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fPIC -pipe -std=c++11 -fno-exceptions")
endif ()#TUTORIAL_LIST代替后面的字符串
set(TUTORIAL_LISTtutorial-00-helloworldtutorial-01-wgettutorial-04-http_echo_servertutorial-05-http_proxytutorial-06-parallel_wgettutorial-07-sort_tasktutorial-08-matrix_multiplytutorial-09-http_file_servertutorial-11-graph_tasktutorial-15-name_servicetutorial-20-reducer
)if (APPLE)set(WORKFLOW_LIB workflow pthread OpenSSL::SSL OpenSSL::Crypto)
elseif (ANDROID)set(WORKFLOW_LIB workflow ssl crypto c)
else ()set(WORKFLOW_LIB workflow pthread OpenSSL::SSL OpenSSL::Crypto ${LIBRT})
endif ()foreach(src ${TUTORIAL_LIST})string(REPLACE "-" ";" arr ${src})list(GET arr -1 bin_name)#将${src}.cc生成可执行文件${bin_name} add_executable(${bin_name} ${src}.cc)#指定${bin_name}链接库${WORKFLOW_LIB}target_link_libraries(${bin_name} ${WORKFLOW_LIB})
endforeach()if (NOT REDIS STREQUAL "n")
set(TUTORIAL_LISTtutorial-02-redis_clitutorial-03-wget_to_redis
)
foreach(src ${TUTORIAL_LIST})string(REPLACE "-" ";" arr ${src})list(GET arr -1 bin_name)add_executable(${bin_name} ${src}.cc)target_link_libraries(${bin_name} ${WORKFLOW_LIB})
endforeach()
endif()if (NOT MYSQL STREQUAL "n")
set(TUTORIAL_LISTtutorial-12-mysql_cli
)
foreach(src ${TUTORIAL_LIST})string(REPLACE "-" ";" arr ${src})list(GET arr -1 bin_name)add_executable(${bin_name} ${src}.cc)target_link_libraries(${bin_name} ${WORKFLOW_LIB})
endforeach()
endif()if (KAFKA STREQUAL "y")add_executable("kafka_cli" "tutorial-13-kafka_cli.cc")target_link_libraries("kafka_cli" wfkafka ${WORKFLOW_LIB} z snappy lz4 zstd)
endif ()set(DIR10 tutorial-10-user_defined_protocol)
add_executable(server ${DIR10}/server.cc ${DIR10}/message.cc)
add_executable(client ${DIR10}/client.cc ${DIR10}/message.cc)
target_link_libraries(server ${WORKFLOW_LIB})
target_link_libraries(client ${WORKFLOW_LIB})set_target_properties(server PROPERTIESRUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/${DIR10})
set_target_properties(client PROPERTIESRUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/${DIR10})

CMakeList笔记相关推荐

  1. Android NDK 之CmakeList 笔记

    前言: 在android ndk 开发中,是经常需要通过cmakelist 来配置 引入库或者编译配置的.这里总结一些常用的cmakelist 中api 语法. 1.add_library 添加库 c ...

  2. linux编程 —— vscode 开发编译 CMakeList.txt 学习笔记

    文档声明: 以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正.并且该文档在后期会随着学习的深入不断补充完善.感谢各位的参考查看. 笔记资料仅供学习交流使用,转载请标明出处 ...

  3. CMakeList常用变量及规则查询笔记

    文章目录 1. 常用的变量及规则 ① 预定义变量 ② 系统信息 ③ 主要开关选项 ④ 环境变量 ⑤ 常用规则 2. 项目组织结构 3. 自定义搜索规则 4. 条件控制 if-elseif-else-e ...

  4. ros 消息队列与缓冲区_[ROS] [笔记(1)] 一个最简单的例子:Hello Robot(消息、发布者与订阅者)...

    本例程包含如下内容: 1)创建编译 Package: 2)自定义消息: 3)发布者与订阅者. 0.Hello Robot 的场景: 我们想要完成这样一个场景: 1)有一系列 robot 排成一排(pu ...

  5. cmake 学习笔记(三) (转)

    接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cmake 的使用. 学习一下cmake的 finder. finder是神马东西? 当编译一个需要使用第三方库的软件时,我 ...

  6. c 指针地址 突然改变_开发笔记 - Cpp - 指针 - 1.1 如何理解指针

    写在最前 作为在贵乎的第一篇文章吧... 允许我加点废话(求轻喷... 应该是从19年的下半年开始,虽然顶着算法工程师的title,但做的很多事情都是开发了,然后19年12月跳槽之后,到了新的环境并开 ...

  7. ROS 学习笔记(三):自定义服务数据srv+server+client 示例运行

    ROS 学习笔记(三):自定义服务数据srv+Server+Client 示例运行 一.自定义服务数据: 1.向功能包添加自定义服务文件(AddTwoInts.srv) cd ~/catkin_ws/ ...

  8. ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行

    ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行 一.自定义消息: 1.新建msg文件夹,创建定义Person.msg 文件 mkdir -p ~/catk ...

  9. ROS 学习笔记(一):工作空间+功能包创建

    ROS 学习笔记(一):工作空间+功能包创建 一.创建工作空间(catkin_make编译): 1.创建工作空间 catkin_ws 创建空间.初始化(建立一个文件夹) cd ~ mkdir -p ~ ...

最新文章

  1. linux宝塔如何开启gzip,宝塔nginx如何开启网站gzip
  2. nyoj n-1位数
  3. hdu1443 Joseph(约瑟夫环)
  4. 【日记】一次程序调优发现的同步IO写的问题,切记
  5. 使用清华开源镜像安装tensorflow
  6. java 8 方法引用(method references)
  7. leetcode45 跳跃游戏II 秒杀所有答案
  8. 流批一体机器学习算法平台
  9. 移动Web开发的十条军规
  10. pycharm中两个.py文件相互调用和传递参数
  11. linux tcp 断网重连,LIS接口与串口服务器的KeepAlive的重连机制
  12. WebView·开车指南
  13. 苹果android投屏,iphone怎么投屏到mac?苹果手机投屏到苹果电脑方法
  14. IOS引入百度统计热力图崩溃
  15. Arturia Sound Explorers Collection Belledonne现已上市
  16. 选择OA,终极“避雷”方法来啦!
  17. C/C++ 链 表 头插法 尾插法
  18. 中国金刚石工具产量和出口量均居于全球前列,市场广阔
  19. 【SpringBoot】SpringBoot常用注解
  20. VVC之PDPC计算步骤

热门文章

  1. spring简单实现打印机功能,详细思路分析 小白上手
  2. Oracle utl_http post响应报文乱码
  3. 【黑金原创教程】【Modelsim】【第四章】激励文本就是仿真环境
  4. Cocos Creator_实现策略_多点触控之触控管理器监听单例_TypeScript
  5. java 面试 接到邀请后你可以做哪些准备
  6. 【HDU2155】小黑的镇魂曲
  7. RFID室内定位技术未来发展遇到的五大难题浅析-新导智能
  8. 博客源码个人博客完整源码
  9. MATLAB-CATIA导入多段直线段
  10. java求n以内的质数