PX4 CMakeLists.txt分析

2023-05-16

简单的概述

make 和 cmake 是linux/UNIX系统下广泛使用的构建编译规则工具,面对复杂庞大的工程,各种源文件和工具文件分布在工程目录下,如何组织和有序地编译和使用这些文件,显然也是一项复杂的任务。Makefile是直接地定义编译规则以及描述目标之间依赖关系。CMakeLists.txt虽然也是具有相同的功能,但是它是对Makefile的抽象化以便更容易地实现工程编译规则的编写。(想更具体了解cmake与make的关系,请google)

PX4下的Makefile

它只是对CMakeLists.txt的一个简单封装,真正定义PX4工程的编译规则由CMakeList.txt文件实现。
这个文件主要完成:

检查cmake版本3.2及以上和解析命令行参数

# Enforce the presence of the GIT repository
#
# We depend on our submodules, so we have to prevent attempts to
# compile without it being present.
ifeq ($(wildcard .git),)
    $(error YOU HAVE TO USE GIT TO DOWNLOAD THIS REPOSITORY. ABORTING.)
endif
#上面检查.git文件是否存在

#若cmake版本3.2以下,将退出
CMAKE_VER := $(shell Tools/check_cmake.sh; echo $$?)
ifneq ($(CMAKE_VER),0)
    $(warning Not a valid CMake version or CMake not installed.)
    $(warning On Ubuntu 16.04, install or upgrade via:)
    $(warning )
    $(warning 3rd party PPA:)
    $(warning sudo add-apt-repository ppa:george-edison55/cmake-3.x -y)
    $(warning sudo apt-get update)
    $(warning sudo apt-get install cmake)
    $(warning )
    $(warning Official website:)
    $(warning wget https://cmake.org/files/v3.4/cmake-3.4.3-Linux-x86_64.sh)
    $(warning chmod +x cmake-3.4.3-Linux-x86_64.sh)
    $(warning sudo mkdir /opt/cmake-3.4.3)
    $(warning sudo ./cmake-3.4.3-Linux-x86_64.sh --prefix=/opt/cmake-3.4.3 --exclude-subdir)
    $(warning export PATH=/opt/cmake-3.4.3/bin:$$PATH)
    $(warning )
    $(error Fatal)
endif
...
...
# Parsing
# --------------------------------------------------------------------
# assume 1st argument passed is the main target, the
# rest are arguments to pass to the makefile generated
# by cmake in the subdirectory
FIRST_ARG := $(firstword $(MAKECMDGOALS))
ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
...
...

定义配置目标以及解析cmake编译规则

# describe how to build a cmake config
define cmake-build
+@$(eval BUILD_DIR = $(SRC_DIR)/build_$@$(BUILD_DIR_SUFFIX))
+@if [ $(PX4_CMAKE_GENERATOR) = "Ninja" ] && [ -e $(BUILD_DIR)/Makefile ]; then rm -rf $(BUILD_DIR); fi
+@if [ ! -e $(BUILD_DIR)/CMakeCache.txt ]; then mkdir -p $(BUILD_DIR) && cd $(BUILD_DIR) && cmake .. -G$(PX4_CMAKE_GENERATOR) -DCONFIG=$(1) $(CMAKE_ARGS) || (cd .. && rm -rf $(BUILD_DIR)); fi
+@echo "PX4 CONFIG: $(BUILD_DIR)"
+@$(PX4_MAKE) -C "$(BUILD_DIR)" $(PX4_MAKE_ARGS) $(ARGS)
endef
...
...
#以make px4fmu-v2_default为例,上面的-DCONFIG=$(1)展开后就是-DCONFIG=nuttx_px4fmu-v2_default
# Get a list of all config targets.
ALL_CONFIG_TARGETS := $(basename $(shell find "$(SRC_DIR)/cmake/configs" ! -name '*_common*' ! -name '*_sdflight_*' -name '*.cmake' -print | sed  -e 's:^.*/::' | sort))
# Strip off leading nuttx_
NUTTX_CONFIG_TARGETS := $(patsubst nuttx_%,%,$(filter nuttx_%,$(ALL_CONFIG_TARGETS)))
#上面sed  -e 's:^.*/::'把find获得结果中目录部分去除

# ADD CONFIGS HERE
# --------------------------------------------------------------------
#  Do not put any spaces between function arguments.

# All targets.
$(ALL_CONFIG_TARGETS):
    $(call cmake-build,$@)

# Abbreviated config targets.

#这里定义了px4fmu-v2_default、px4fmu-v4_defaul等目标
# nuttx_ is left off by default; provide a rule to allow that.
$(NUTTX_CONFIG_TARGETS):
    $(call cmake-build,nuttx_$@)
...
...

进入工程根目录,在终端输入make px4fmu-v2_default时, 将在工程根目录下创建build_px4fmu-v2_default目录,然后进入此目录执行cmake .. -G”Unix Makefiles” -DCONFIG=nuttx_px4fmu-v2_default命令来解析工程根目录下的CMakeLists.txt文件,因此在build_px4fmu-v2_default下形成整个工程的编译规则。

具体分析PX4工程的编译规则CMakeList.txt(以make px4fmu-v2_default为例)

设置基本变量与引入cmake模块

set(PX4_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
set(PX4_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
...
#=============================================================================
# configuration
#
# must come before project to set toolchain

string(REPLACE "_" ";" config_args ${CONFIG})
list(GET config_args 0 OS)
list(GET config_args 1 BOARD)
list(GET config_args 2 LABEL)
set(target_name "${OS}-${BOARD}-${LABEL}")
#以make px4fmu-v2_default为例,${CONFIG}=nuttx_px4fmu-v2_default, ${OS}=nuttx ${BOARD}=px4fmu-v2 ${LABEL}=default
...
list(APPEND CMAKE_MODULE_PATH "${PX4_SOURCE_DIR}/cmake")
message(STATUS "cmake module path: ${CMAKE_MODULE_PATH}")
set(config_module "configs/${CONFIG}")
include(${config_module})
#加载自定义的nuttx_px4fmu-v2_default.cmake模块,其位于${PX4_SOURCE_DIR}/cmake/configs/目录下
...

检测自定义cmake函数有没有实现,没有的话输出致命错误,退出cmake

#下面两个必要接口函数在${PX4_SOURCE_DIR}/cmake/nuttx/px4_impl_nuttx.cmake模块中实现
# require px4 module interface
set(px4_required_interface
    px4_os_prebuild_targets
    px4_os_add_flags
    )
foreach(cmd ${px4_required_interface})
    if(NOT COMMAND ${cmd})
        message(FATAL_ERROR "${config_module} must implement ${cmd}")
    endif()
endforeach()
#config_module_list变量在${PX4_SOURCE_DIR}/cmake/configs/nuttx_px4fmu-v2_default.camke中定义,很重要的一个变量。
#关乎PX4工程目录下src目录中的代码能否编译进烧入Pixhawk板子的固件中
set(px4_required_config
    config_module_list
    )
foreach(conf ${px4_required_config})
    if(NOT DEFINED ${conf})
        message(FATAL_ERROR "cmake/${config_module} must define ${conf}")
    endif()
endforeach()
...

#=============================================================================
#在${PX4_SOURCE_DIR}/cmake/configs/nuttx_px4fmu-v2_default.camke中定义了系统变量
#${CMAKE_TOOLCHAIN_FILE}=${PX4_SOURCE_DIR}/cmake/toolchains/Toolchain-arm-none-eabi.cmake
# 这便指定了交叉编译所需的配置
# check required toolchain variables
#
set(required_variables
    CMAKE_C_COMPILER_ID
    )
foreach(var ${required_variables})
    if (NOT ${var})
        message(FATAL_ERROR "Toolchain/config must define ${var}")
    endif()
endforeach()
...

添加git submodule目标,其实没有干什么具体事情。

#=============================================================================
# git
#
px4_add_git_submodule(TARGET git_genmsg PATH "Tools/genmsg")
px4_add_git_submodule(TARGET git_gencpp PATH "Tools/gencpp")
px4_add_git_submodule(TARGET git_mavlink PATH "mavlink/include/mavlink/v1.0")
px4_add_git_submodule(TARGET git_gtest PATH "unittests/gtest")
px4_add_git_submodule(TARGET git_uavcan PATH "src/modules/uavcan/libuavcan")
px4_add_git_submodule(TARGET git_nuttx PATH "NuttX")
px4_add_git_submodule(TARGET git_driverframework PATH "src/lib/DriverFramework")
px4_add_git_submodule(TARGET git_ecl PATH "src/lib/ecl")
px4_add_git_submodule(TARGET git_jmavsim PATH "Tools/jMAVSim")
px4_add_git_submodule(TARGET git_gazebo PATH "Tools/sitl_gazebo")
px4_add_git_submodule(TARGET git_matrix PATH "src/lib/matrix")
px4_add_git_submodule(TARGET git_cmake_hexagon PATH "cmake/cmake_hexagon")
...

nuttx系统源码的配置及编译(很重要),后面单独地具体分析!

#=============================================================================
# external libraries
#
#定义了prebuild_targets目标,其依赖nuttx_export_px4fmu-v2目标
px4_os_prebuild_targets(OUT prebuild_targets
    BOARD ${BOARD}
    THREADS ${THREADS})

#=============================================================================
# build flags
#
px4_os_add_flags(
    BOARD ${BOARD}
    C_FLAGS c_flags
    CXX_FLAGS cxx_flags
    OPTIMIZATION_FLAGS optimization_flags
    EXE_LINKER_FLAGS exe_linker_flags
    INCLUDE_DIRS include_dirs
    LINK_DIRS link_dirs
    DEFINITIONS definitions)

px4_join(OUT CMAKE_EXE_LINKER_FLAGS LIST "${exe_linker_flags}" GLUE " ")
px4_join(OUT CMAKE_C_FLAGS LIST "${c_flags};${optimization_flags}" GLUE " ")
px4_join(OUT CMAKE_CXX_FLAGS LIST "${cxx_flags};${optimization_flags}" GLUE " ")

include_directories(${include_dirs})
#message("INCLUDE_DIRS=${include_dirs}")
link_directories(${link_dirs})
add_definitions(${definitions})
...

msg目录下的ROS msg定义文件被处理成关于topic的C结构体和C++类定义与针对px4fmu-v2板子参数的处理

#=============================================================================
# source code generation
#
#msg目录下的CMakeList.txt文件设置msg_files变量为所有topic文件名
add_subdirectory(msg)
#主要生成${PX4_BINARY_DIR}/src/modules/uORB/topics目录下所有topic头文件(topic的C结构体声明)
#和${PX4_BINARY_DIR}/topics_sources目录下的所有topic源文件(topic的定义)
#和${PX4_BINARY_DIR}/src/platforms/${OS}/px4_messages目录下所有C++-style topic 头文件(topic的C++类声明)
#msg_gen目标依赖prebuild_targets
px4_generate_messages(TARGET msg_gen
    MSG_FILES ${msg_files}
    OS ${OS}
    DEPENDS git_genmsg git_gencpp prebuild_targets
    )
px4_generate_parameters_xml(OUT parameters.xml BOARD ${BOARD})
px4_generate_airframes_xml(OUT airframes.xml BOARD ${BOARD})
add_custom_target(xml_gen
    DEPENDS parameters.xml airframes.xml)
...

处理src目录下各个子目录的CMakelist.txt,将生成各个子模块以组件方式构建PX4固件

#=============================================================================
# subdirectories
#
set(module_libraries)
foreach(module ${config_module_list})
    string(REGEX MATCH "^[./]" external_module ${module})
    if(external_module)
        STRING(REGEX REPLACE "//" "/" EXT_MODULE ${module})
        STRING(REGEX REPLACE "/" "__" EXT_MODULE_PREFIX ${EXT_MODULE})
        add_subdirectory(${module} ${PX4_BINARY_DIR}/${EXT_MODULE_PREFIX})
    else()
        #处理各个子目录的CMakeLists.txt文件,config_module_list变量指定了src目录
        #下哪个子目录被编译成模块库的形式
        add_subdirectory(src/${module})
    endif()
    px4_mangle_name(${module} mangled_name)
    list(APPEND module_libraries ${mangled_name})
    #message(STATUS "adding module: ${module}")
endforeach()

# Keep track of external shared libs required for modules
set(module_external_libraries "${module_external_libraries}" CACHE INTERNAL "module_external_libraries")

#在src/firmware/nuttx/下的CMakeLists.txt定义了
#${fw_file}=${CMAKE_CURRENT_BINARY_DIR}/nuttx_px4fmu-v2_default.px4目标,
#即在build_px4fmu-v2_default/src/firmware/nuttx/下生成固件。
#Note:想详细了解烧到pixhawk板子的固件到底如何生成的,看这个目录下的CMakeLists.txt
#很很重要!!!!!
add_subdirectory(src/firmware/${OS})
...

px4io-v2的配置与编译规则

#在cmake/configs/nuttx_px4fmu-v2_default.cmake文件中定义此变量
if (config_io_board)
    #处理这个目录下CMakeLists.txt文件,将生成px4io-v2.bin
    add_subdirectory(src/modules/px4iofirmware)
endif()
...

手写CMakeLists.txt大致的流程图:

这里写图片描述

手写的整个工程目标的依赖关系图:

这里写图片描述
这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PX4 CMakeLists.txt分析 的相关文章

  • PX4模块设计之三十六:MulticopterPositionControl模块

    PX4模块设计之三十六 xff1a MulticopterPositionControl模块 1 MulticopterPositionControl模块简介2 模块入口函数2 1 主入口mc pos control main2 2 自定义
  • PX4模块设计之三十九:Commander模块

    PX4模块设计之三十九 xff1a Commander模块 1 Commander模块简介2 模块入口函数2 1 主入口commander main2 2 自定义子命令custom command 3 Commander模块重要函数3 1
  • CMakeLists 理解

    CMakeLists 理解 最近发现其实之前对CMakeLists 理解不是很全面 xff0c 零零散散在网上看到的一些教程 xff0c 其实都是为了解决某个命令的问题 xff0c 要不然就是对一些命令的翻译理解 xff0c 实际上是很劝退
  • python 读取一个文件夹下的所jpg文件保存到txt中

    最近需要使用统计一个目录下的所有文件 xff0c 使用python比较方便 xff0c 就整理了一下代码 1 import os 2 3 def gci filepath 4 files 61 os listdir filepath 5 f
  • px4_simple_example和uorb机制

    px4 simple app PX4 Autopilot src exampes px4 simple app xff0c 这个程序是用c语言调用orb API和poll机制订阅和发布通讯数据 xff0c 但是这个例子并不是既有接收又有发送
  • PX4-4-任务调度

    PX4所有的功能都封装在独立的模块中 xff0c uORB是任务间数据交互和同步的工具 xff0c 而管理和调度每个任务 xff0c PX4也提供了一套很好的机制 xff0c 这一篇我们分享PX4的任务调度机制 我们以PX4 1 11 3版
  • ORB_SLAM2 CMakeLIsts文件注释

    最近在学习ORB SLAM 发现基本找不到CMakeLists的代码注释 就决定自己注释一份 如果发现有问题的地方 欢迎和我交流 span class token function cmake minimum required span s
  • 数据集txt格式划分为多个txt文件夹

    简单记录一下数据标签txt格式划分为多个文件 xff0c 通常我们标注号的标签 xff0c 都是在一个txt文件夹中 xff0c 我们训练的时候需要把txt中的标签按照一定的比例划分为多个文件 xff0c 这里贴出划分为三个文件的代码 xf
  • CMakeLists.txt中FIND_PACKAGE()是如何工作的?

    官方文档 xff1a https cmake org cmake help latest command find package html FIND PACKAGE lt PackageName gt 如何查找头文件和库文件路径 xff1
  • 学习cmake的使用和CMakeLists.txt

    1 学习cmake的使用和CMakeLists txt 文章目录 1 学习cmake的使用和CMakeLists txt1 1 cmake外部构建基础1 2 让每个源文件目录都包含一个CMakeLists txt1 3 安装 1 4 构建静
  • PX4项目学习::(五)模块代码启动流程

    54条消息 PX4 模块代码启动流程 zhao23333的博客 CSDN博客
  • python 读取txt出现\xef\xbb\xbf…的问题

    用python读取txt文件 xff0c 文件的内容是一列数如下 xff1a 1883 1886 1900 1900 1897 1897 1897 1897 1906 1917 1910 1910 但是读取的时候第一个元素为 xef xbb
  • Make、Makefile、CMake和CMakeLists

    一 Make 在 认识编译器和C C 43 43 编译 一文中介绍过 xff0c 一个 c cpp 文件从源文件到目标文件的过程叫做编译 xff0c 但是一个项目中不可能只存在一个文件 xff0c 这就涉及到多个文件的编译问题 xff0c
  • Makefile以及CMakelists的编辑

    1 概念 在linux中不像windows和mac有图形界面 xff0c 怎么快速的用命令行运行大型项目成为一个问题 xff0c 并且像c c 43 43 需要自己添加include文件的位置 xff0c 当文件数目变多的时候 xff0c
  • PX4:Policy “CMP0097“ is not known to this version of CMake.

    make px4 fmu v3 时报的错 CMake版本的问题 由https blog csdn net zhizhengguan article details 118380965推测 xff0c 删除cmake policy也没事 ma
  • 大神浅谈无人机飞控软件设计 系统性总结

    写在前面 深感自己对飞控软件 算法的知识点过于杂乱 很久没有进行系统的总结了 因此决定写几篇文章记录一些飞控开发过程的知识点 主要是针对一些软件 算法部分进行讨论 如内容有错误 欢迎指出 1 飞控软件的基本模块 无人机能够飞行主要是依靠传感
  • COLMAP导出相机外参(bin文件转txt文件)

    官方给出的images txt如下图 Image list with two lines of data per image 每张图像数据占两行 IMAGE ID QW QX QY QZ TX TY TZ CAMERA ID NAME 图像
  • Java解析txt文件

    Java解析txt文件 package com wb test import java io BufferedReader import java io File import java io FileInputStream import
  • Android Studio3.4.2新建C++项目,CMakeLists批量添加代码编译不过的坑

    上段时间升级了AS到3 4 2 最后新建了个C 的项目 然后生成的那个native lib cpp文件就可以编译 但是我的项目里 C 代码文件非常多 显然一个一个地添加太慢了 然后就想批量添加进去 但总是编译不过 真是orz 像上图这样 批
  • [Python进阶] Python处理txt文件:open

    7 1 Python处理txt文件 open 在Python中 通过open函数可以打开一个文件 创建一个file对象 然后对该对象进行读写 函数语法 open name mode buffering 参数说明 name 文件名 mode

随机推荐

  • Linux(openEuler)没有界面连接互联网方法

    前言 系统版本openEuleropenEuler 22 03 LTS x86 64 dvd 我们在安装linux之后 xff0c 一般都是无界面的情况 大部分情况都是需要自己安装界面的 xff0c 如果路由器的情况下直接插上网络就好了 下
  • c#实现内存映射文件共享内存

    内存映射文件是利用虚拟内存把文件映射到进程的地址空间中去 xff0c 在此之后进程操作文件 xff0c 就像操作进程空间里的地址一样了 xff0c 比如使用c语言的 memcpy等内存操作的函数 这种方法能够很好的应用在需要频繁处理一个文件
  • c#Gdi画图的两种方式

    用Graphics绘图的两种方法 在学习C 画图的时候非常的蛋疼 其中的一条原因是之前没有搞过 xff0c 其中之二是办公的环境有点差 这就是我找的2种学习非常蛋疼的原因 虽然是这样但是学还是要学的 本篇文章都是在xxx paint obj
  • 一个小巧的C++Log输出到文件类

    一个小巧的C 43 43 Log输出到文件类 xff08 转 xff09 作者 xff1a wangyin159 http www cnblogs com mazhenyu p 4139352 html 一个小巧的C 43 43 Log输出
  • beego创建项目

    span class token comment 安装beego框架 span go get u github com beego beego v2 span class token comment 安装bee工具 span go get
  • 我的C++回调函数的理解

    今天在看一个多线程下载文件的代码时 xff0c 让我很头痛 因为该程序中运用了大量的回调函数 在我们学习一种技术的时候我们就要去知道几个问题 1 回调函数是什么东西 xff1f 2 回调函数怎么开发 xff0c 怎么使用 xff1f 3 回
  • c++ 中文和十六进制的互转

    CString CHexAndStrDlg StrToHex CString strData 初始化 CString strTemp 61 34 34 int iLenth 61 strData GetLength char cArrDat
  • 一篇文章,中文发完英文发,算“一稿多投”吗?

    近期有作者问小编 xff08 www unionpub cn xff09 xff0c 为什么有人换种语言 xff0c 发表了两篇同样内容的文章 而不算 34 一稿多投 34 一稿多投 是被明确禁止的 xff0c 但上述 34 二次发表 的行
  • 【CCF推荐专区】计算机类优质SCI&EI好刊,期刊质量高,部分期刊仅有少量版面

    x1f308 智能传感类 xff08 TOP xff09 CCF C类 期刊简介 IF 7 0 8 0 xff0c JCR1区 xff0c 中科院2 1区 检索情况 SCI amp EI 双检 xff0c 正刊 xff0c CCF C类 征
  • 考研杭电非全计算机技术调剂上岸

    考研杭电非全计算机技术调剂上岸 简介初试考完心态复试写这个的目的 简介 昨天看见杭电考研群里说到传承 xff0c 我觉得很有价值 xff0c 所以打算也写了我的一些想法 xff0c 希望对你们有帮助 本人31岁 xff0c 有老婆有孩子 x
  • 各种滤波算法的比较

    原文地址 xff1a http www wtoutiao com p 1fe9dPI html xfeff 各种滤波算法的比较 数字滤波 digital filtering 数字滤波 digital filtering 用数字设备 xff0
  • 十九.Linux开发之根文件系统移植——根文件系统的原理

    有道云笔记地址 xff1a 详情看这里链接 xff0c 记录太多 xff0c 就不一一排版了 http note youdao com noteshare id 61 f9c7c1b589233d7b6ed661c3749f1ce8 amp
  • (转)临界区,互斥量,信号量,事件的区别(线程同步)

    四种进程或线程同步互斥的控制方法 1 临界区 通过对多线程的串行化来访问公共资源或一段代码 xff0c 速度快 xff0c 适合控制数据访问 2 互斥量 为协调共同对一个共享资源的单独访问而设计的 3 信号量 为控制一个具有有限数量用户资源
  • Git clone的使用方法

    使用Git clone项目 1 首先我们要确保我们的电脑上已经安装Git 桌面点击右键出现如下图所示的两个Git即Git已经安装 2 在电脑的任意一个磁盘里新建一个本地文件夹作为clone项目的保存文件夹 3 在码云上面打开我们要clone
  • error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”

    报错1 xff1a error LNK2038 检测到 ITERATOR DEBUG LEVEL 的不匹配项 值 0 不匹配值 2 解决 xff1a xff08 1 xff09 工程的模式和库的模式不一致 xff0c 工程为Debug模式
  • 关于p操作和v操作的理解

    操作系统之PV操作 今天在做操作系统老师布置的操作系统作业 xff0c 但是碰到了一个有关pv操作的问题 xff0c 由于对pv操作的理解不是很透彻 xff0c 所以我查阅了很多资料 xff0c 下面来简单的通俗的介绍一下pv操作 1 信号
  • 相机针孔模型----从世界坐标系,到相机坐标系,再到图像物理坐标系,最后到图像像素坐标系的转换过程解析

    看了很多讲解针孔相机模型中从世界坐标系 gt 到相机坐标系 gt 图像坐标系的文章 xff0c 心里的疑惑也逐渐展开 xff0c 现在总结一下自己的理解 xff1a 世界坐标系 相机坐标系 图像物理坐标系 图像像素坐标系在我的另一篇博文里已
  • 如何在cmd查看文件内容的MD5值

    在cmd下进入 要查看的文件目录 进入cmd xff0c 输入如下命令 xff1a certutil hashfile 文件名称 文件类型 MD5 结果显示如下 SHA1 的 test py 哈希 364ebe3569456ec7e77de
  • CMakeLists.txt文件

    举例说明 xff1a CMake 构建 HelloSlam 工程 1 Ctrl 43 Alt 43 T 按键打开终端 2 在选定路径下建立工程文件夹 xff1a mkdir HelloSlam 3 构建 HelloSlam 的文件目录结构
  • PX4 CMakeLists.txt分析

    简单的概述 make 和 cmake 是linux UNIX系统下广泛使用的构建编译规则工具 xff0c 面对复杂庞大的工程 xff0c 各种源文件和工具文件分布在工程目录下 xff0c 如何组织和有序地编译和使用这些文件 xff0c 显然