CmakeLists.txt编写流程梳理

2023-05-16

目录

    • 背景:
    • 1. 设置最低版本:
    • 2. 设置名称, 版本号:
    • 3. 设置c/c++支持版本
    • 4. 设置编译器参数
    • 5. 目标文件输出目录
    • 6. 判断平台,定义平台宏
    • 7. 设置第三方头文件和设置链接库寻找路径
    • 8. 添加自己的头文件
    • 9. 添加自己的源文件
    • 10. 生成可执行文件
    • 11. 添加依赖库
    • 12. 其他:

背景:

  每次编写cmakelists.txt不知道何处下笔,故在流程维度进行梳理,供编写时使用。开发时可进行流程裁剪。

1. 设置最低版本:

 cmake_minimum_required(VERSION 3.5)

2. 设置名称, 版本号:

  set(AF_VS_VERSION "1.0.0.0" CACHE STRING "project version")
    project(test_protobuf VERSION ${AF_VS_VERSION})

3. 设置c/c++支持版本

	 #Default to C99
    if(NOT CMAKE_C_STANDARD)
        set(CMAKE_C_STANDARD 99)
    endif()

    if(NOT CMAKE_CXX_STANDARD)
        set(CMAKE_CXX_STANDARD 11)
    endif()

4. 设置编译器参数

  if (CMAKE_COMPILER_IS_GNUCXX)
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-Bsymbolic")
      # set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
      # set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -g -O2 -Wall")
      # add_compile_options(-Wall -Wextra -Wpedantic -fPIC -fvisibility=hidden)
        add_compile_options(-Wall -g -Wextra -fvisibility=hidden -Wpedantic)
        if (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "x86_64")
            #add_compile_options(-Werror) # x86机器执行编译严格模式
            #add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) # 兼容低版本ABI
        endif()
    else() # MSVC
        if(CMAKE_CL_64) # CMAKE内建变量,如果是true,说明编译器是64位,自然可以编译64bit的程序
            set(ADDRESS_MODEL 64)
            set(NODE_TARGET x64)
        else()
            set(ADDRESS_MODEL 32)
            set(NODE_TARGET x86)
        endif()
        add_definitions(-D_CRT_SECURE_NO_WARNINGS)
        add_definitions(-DUNICODE -D_UNICODE)
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8")
        set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi")
        set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
        set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG:FULL /OPT:REF /OPT:ICF")
        set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG:FULL /OPT:REF /OPT:ICF")
    endif()

5. 目标文件输出目录

set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin)
 # set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH})

6. 判断平台,定义平台宏

   IF (CMAKE_SYSTEM_NAME STREQUAL "Linux")
        MESSAGE(STATUS "current platform: Linux ")
        add_definitions(-DLINUX)
    ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "Windows")
        MESSAGE(STATUS "current platform: Windows ")
        add_definitions(-DWINDOWS)
    ELSE ()
        MESSAGE(FATAL_ERROR "not support other platform: ${CMAKE_SYSTEM_NAME}")
    ENDIF()

7. 设置第三方头文件和设置链接库寻找路径

   if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
      include_directories(${PROJECT_THIRD}/include/linux/dongle)
      link_directories(${PROJECT_THIRD}/libs/linux/test)
    else ()
      include_directories(${PROJECT_THIRD}/include/windows)
      link_directories(${PROJECT_THIRD}/libs/windows)
     endif()

8. 添加自己的头文件

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)

9. 添加自己的源文件

  aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/        SRC_FILES)
  aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src     SRC_FILES)

10. 生成可执行文件

  add_executable(${PROJECT_NAME} ${SRC_FILES})

11. 添加依赖库

  if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
        if(CMAKE_BUILD_TYPE STREQUAL "Debug")
            # target_link_libraries(${PROJECT_NAME} libprotobufd.lib)
        else()
            # target_link_libraries(${PROJECT_NAME} libprotobufd.lib)
        endif()
    else()
        target_link_libraries(${PROJECT_NAME} test.so)
    endif()

12. 其他:

1. 定义Build/Release
  if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
  endif()

2. 执行脚本
  if(WIN32)
    execute_process(
      COMMAND cmd /C ${CMAKE_CURRENT_SOURCE_DIR}/../proto/run.bat  
      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../proto/
    )
  else()
    execute_process(
        COMMAND cmd /C ${CMAKE_CURRENT_SOURCE_DIR}/../proto/run.sh  
        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../proto/
      )
  endif()

3. 查找所有文件
  file(GLOB_RECURSE check_src  "./*.h" "./*.cpp" "./protobuf/*.cc" "./protobuf/*.h")
  source_group_by_dir(check_src)
  list(APPEND SRC_LIST ${check_src})

4. 设置cmake中开关变量
  option(COMMONOMR_WITH_TEST "Compile commonomr test" ON)

5. 添加子文件
  add_subdirectory(src bin)

6. 预定义
  # 将文件复制到另一个位置并修改其内容。
  # 将输入文件version.h.in的内容复制到输出文件version.h中,
  # 并且输入文件中的@BUILD_TIME@ 
    #define BUILD_TIME "@BUILD_TIME@"
  
  string(TIMESTAMP BUILD_TIME "%Y/%m/%d %H:%M:%S")
  configure_file(version.h.in version.h)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CmakeLists.txt编写流程梳理 的相关文章

  • 过程记录 yolov3目标检测输出目标坐标和原图物体像素坐标比较

    设备 xff1a jetsonnano B01 一个usb广角摄像头 语言为python 库为opencv 框架pytorch 大家都知道yolov3的坐标变换过程比较复杂 xff0c 大概要经过图片缩放 xff0c 对数空间变换等等 xf
  • Rt-Thread学习笔记-----信号量(五)

    线程间同步 1 什么是线程间同步 xff1f 同步是指按预定的先后次序进行运行 xff0c 线程同步是指多个线程通过特定的机制来控制线程之间的执行顺序 xff0c 也可以说是在线程之间通过同步建立起执行顺序的关系 xff0c 如果没有同步
  • C++类和对象——空指针访问成员函数

    C 43 43 中空指针也是可以访问成员函数的 xff0c 但是也要注意有没有用到this指针 xff1b 如果用到this指针 xff0c 需要加以判断保证代码的健壮性 span class token macro property sp
  • nodejs实现简单的自动化部署

    如题 xff0c nodejs通过码云提供的web hooks实现简单的服务器自动部署 大致流程 xff1a 1 通过码云提供的web hooks xff0c 创建一个request通过后的回调接口 xff08 说白了就是配置一个码云审批通
  • 2022届春招实习面经(CV岗)——offer经

    已拿offer公司 xff1a 腾讯 ponyai vivo研究院 华为 字节 面了一面就没继续面了 xff1a 海康威视 虎牙 京东 本科211 xff0c 硕士985 二区在投论文 43 顶会下的top5比赛 43 小厂三个月实习经历
  • LeetCode刷题笔记 --- python

    目录 一 python交换两个变量的值1 1 使用tuple1 2 使用临时变量temp 二 python中 和 区别三 python列表的使用3 1 列表的基本操作3 2 列表实现栈操作3 3 列表实现排序3 4 列表的算法效率 四 py
  • 无人机高度控制

    这个第一次看就完全没看懂 xff0c 现在再看还是没看懂orz xff0c 而且定高还是重要的功能和考点 xff0c 详细分析一下程序吧 首先是表示高度信息的结构体 xff1a 数据结构声明 typedef struct float Z S
  • ssh_exchange_identification: Connection closed by remote host

    ssh exchange identification Connection closed by remote host 导致这个问题的原因有很多 xff0c 笔者是因为在ssh中设置了代理 xff0c 这个可以作为阅读者排查问题的一个点
  • 匿名无人机飞控代码整理5

    先跳过高度部分 xff0c 这里看location部分 可以看出来这部分也是直接与我们的循迹 追踪任务相关的 所以这部分的掌握应该很重要把 前面有很多暂时不需要看 xff0c flyctrl那个巨长 所以就先看速度环控制部分了 if swi
  • 匿名无人机飞控代码整理

    看了半天 xff0c 各部分都看得都很零散 xff0c 写的也很简略 xff0c 但目前为止还是无法对系统各部分做具体一点的整合 xff0c 今天试试看 1 先从主函数起 xff0c 进入主轮询函数 Main Task 这个主函数的调用就在
  • 一直没看的无人机定高

    除了定高的部分 xff0c 其他没看的还有一些控制函数 定高的原理的话 xff0c 也是利用了两级pid xff0c 按照原本的理解 xff0c 从外环开始看的话 xff0c 反馈高度比较容易获得 xff0c 就是激光测距得到的高度 期望高
  • 匿名无人机代码FlightCtrl简单分析

    这个flightCtrl文件 xff0c 是真的很长又很难 各种标志位啊 xff0c 判断啊 xff0c 开关啊 xff0c 逻辑判断啊什么的 xff0c 趁通宵把代码梳理一遍 这个文件里的函数虽不算最多 xff0c 但引用的头文件相当多
  • 简历—项目经验范例

    xff08 看着比较专业的一份项目经验样板 xff09 原文链接https mp weixin qq com s rxGTTVKryvYoyst jsayLw 项目一 米乐淘网上商城 项目名称 xff1a 米乐淘网上商城 开发环境 xff1
  • 家庭网络和路由器

    1 什么是家庭网络 xff1f 一个典型的家庭网络由多个设备组成 xff0c 且几乎所有的家庭网络都有一个路由器作为它们的中心设备 路由器连接到 Internet 连接 xff0c 然后与本地网络上的一台或多台计算机共享该连接 家庭网络通常
  • ROS动态调整PID

    64 动态调整PID ROS提供了一个专门用于动态调整参数的功能包dynamic reconfigure 它实现了动态配置参数的机制 我们先来创建一个功能包 添加相应的一些依赖 cd catkin ws src catkin create
  • CubeMX配置串口的程序烧入板子不跑的解决方法

    对于cubeMX配置串口 xff0c keil5编译通过的 xff0c 自己确定无问题的程序 xff0c 以ISP烧入 xff0c 烧入板子后无法运行的情况 xff0c 我暂时的解决策略是按住reset键点击 开始编程 xff0c 点击后松
  • realsense D455+ROS+OpenCV4.5完成目标距离检测

    ROS OpenCV 1 环境配置 1 1 realsense SDK2 0安装 通过官网找到最新的SDK包并下载 Intel RealSense SDK 2 0 解压安装包 xff08 librealsense 2 47 0 tar gz
  • 什么是 PID 控制器:工作原理及其应用

    什么是 PID 控制器 xff1a 工作原理及其应用 什么是PID控制器 xff1f 历史PID控制器框图PID控制器的工作P 控制器I 控制器D 控制器 PID控制器的类型开 关控制比例控制标准型PID控制器实时 PID 控制器 调优方法
  • 什么是缓冲区

    1 什么是缓冲区 缓冲区又称为缓存 xff0c 它是内存空间的一部分 也就是说 xff0c 在内存空间中预留了一定的存储空间 xff0c 这些存储空间用来缓冲输入或输出的数据 xff0c 这部分预留的空间就叫做缓冲区 缓冲区根据其对应的是输
  • FreeRTOS系统解析-1、FreeRTOS系统简介

    1 系统简介 不同的的多任务系统有不同的侧重点 以工作站和桌面电脑为例 xff1a 早期的处理器非常昂贵 xff0c 多以那时的多任务用于实现在单处理器上支持多用户 这类系统中的调度算法侧重于让每个用户 公平共享 处理器时间 随着处理器的功

随机推荐