转载:ESP32 官方文档(二)构建系统

构建系统

  • 构建系统
    • 使用构建系统
    • 概要
      • 概念
      • 示例项目
      • 项目 Makefile
        • 最小示例 Makefile
        • 强制项目变量
        • 可选项目变量
      • 组件 Makefile
      • 搜索组件
        • 具有相同名称的多个组件
        • 最小组件 Makefile
        • 预设组件变量
        • 可选项目范围的组件变量
        • 可选特定的组件变量
      • 组件配置
      • 示例:添加二进制库、组件配置文件 Kconfig
      • 预处理器定义
      • 构建过程内部
        • 顶级:Project Makefile
        • 第二级:组件Makefile
      • 以非交互方式运行
      • 高级 Make 用法
      • 调试 Make Process
        • 警告未定义的变量
      • 覆盖项目的部分内容
        • Makefile.projbuild
        • KConfig.projbuild
        • Makefile.componentbuild
        • 仅配置组件
      • 示例组件 Makefile
        • 添加源文件目录
        • 指定源文件
        • 添加条件配置
        • 源代码生成
        • Cosmetic Improvements
        • 嵌入二进制数据
      • 完全覆盖组件 Makefile
      • 自定义 sdkconfig 默认值
      • 保存 flash 参数
    • 构建 Bootloader

构建系统

本文档解释了 Espressif 物联网开发框架构建系统和“组件”的概念.

如果您想知道如何组织新的 ESP-IDF 项目,请阅读本文档.

我们建议使用 esp-idf-template 项目作为项目的起点.

使用构建系统

esp-idf 中的 README 文件有如何使用构建系统构建项目的说明.

概要

一个 ESP-IDF 项目可以看作是多个组件的组合.例如,对于显示当前湿度的网络服务器,可能有:

  • ESP32 基础库( libc,rom bindings 等)
  • WiFi 驱动
  • TCP / IP 协议堆栈
  • FreeRTOS 操作系统
  • Web 服务器
  • 湿度传感器驱动
  • 主程序

ESP-IDF 使这些组件结构更清晰并具有可配置性.为此,在编译项目时,构建环境将查找 ESP-IDF 目录、项目目录和(可选)其他自定义组件目录中的所有组件.之后,它允许用户使用基于文本的菜单系统去自定义每个组件来配置 ESP-IDF 项目.在配置完项目中的组件之后,构建程序将编译项目.

概念

  • “项目”是一个目录,其中包含构建单个 “app” (可执行文件)所需的文件和配置,以及其他附加文件,如:分区表,数据/文件系统分区和引导程序.
  • “项目配置”保存在项目根目录中的 sdkconfig 文件中.通过 make menuconfig 修改此文件以自定义项目配置.单个项目只包含一个项目配置.
  • “app” 是由 esp-idf 构建的可执行文件.单个项目通常会构建两个应用程序 - 一个“项目应用程序”(主要可执行文件,即您的自定义固件)和一个“引导程序”(启动项目应用程序的初始引导程序).
  • “组件”是独立代码的模块化部分,它们被编译成静态库(.a文件)并链接到应用程序.有些是由 esp-idf 本身提供的,有些则可能来自其他地方.

有些东西不是项目的一部分:

  • “ESP-IDF” 不是该项目的一部分.相反,它是独立的,并通过 IDF_PATH 环境变量链接到项目,该变量保存 esp-idf 目录的路径.这允许 IDF 框架与您的项目分离.
  • 用于编译的工具链不是项目的一部分.工具链应安装在系统命令行 PATH 中,或者工具链的路径设置为项目配置中编译器前缀的一部分.

示例项目

一个示例项目目录结构可能如下所示:

 - myProject/- Makefile- sdkconfig- components/ - component1/ - component.mk- Kconfig- src1.c- component2/ - component.mk- Kconfig- src1.c- include/ - component2.h- main/       - src1.c- src2.c- component.mk
         - build/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

“myProject” 示例包含以下元素:

  • 顶层项目 Makefile .此 Makefile 设置 PROJECT_NAME 变量,并(可选)定义项目范围的 make 变量.它包括核心的 $(IDF_PATH)/make/project.mk Makefile 文件,它实现了 ESP-IDF 构建系统的其余部分.
  • “sdkconfig” 项目配置文件.当 “make menuconfig” 运行时,将创建/更新此文件,并保存项目中所有组件的配置(包括 esp-idf 本身).“sdkconfig” 文件可能会也可能不会添加到项目的源代码管理系统中.
  • 可选的 “components” 目录包含属于项目一部分的组件.项目不必包含此类自定义组件,但它可用于构造可重用代码或包括不属于 ESP-IDF 的第三方组件.
  • “main” 目录是一个特殊的“伪组件(pseudo-component)”,它包含项目本身的源代码.“main” 是默认名称,Makefile 变量COMPONENT_DIRS包含此组件,但您可以修改此变量(或设置 EXTRA_COMPONENT_DIRS)以查找其他位置的组件.
  • “build” 目录是项目编译时创建的,包含项目编译时产生的文件.运行 make 后,该目录被创建,并包含临时目标文件和库以及最终的二进制输出文件 bin.此目录通常不会添加到源代码管理中,也不会随项目源代码一起发布.

组件目录包含一个组件 makefile 文件 - component.mk.这可能包含变量定义,以控制组件的构建过程,以及它与整个项目的集成.有关更多详细信息,请参阅[组件Makefile](#组件 Makefile).

每个组件还可以包括一个 Kconfig 文件,用于定义通过项目配置设置的组件配置选项.某些组件还可能包含 Kconfig.projbuildMakefile.projbuild 文件,这些文件是用于覆盖项目部分的特殊文件.

项目 Makefile

每个项目都有一个 Makefile,其中包含整个项目的构建配置.默认情况下,项目 Makefile 可以非常小.

最小示例 Makefile

PROJECT_NAME := myProject

include $(IDF_PATH)/make/project.mk

  • 1
  • 2
  • 3

强制项目变量

  • PROJECT_NAME:项目名称.二进制输出文件将使用此名称 - 即 myProject.bin, myProject.elf.

可选项目变量

这些变量都有默认值,并可以被自定义操作覆盖.查看 make/project.mk 以获取所有实现细节.

  • PROJECT_PATH:顶级项目目录.默认为包含 Makefile 的目录.许多其他项目变量都基于此变量.项目路径不能包含空格.
  • BUILD_DIR_BASE:所有 objects/libraries/binaries 文件的构建输出目录.默认为$(PROJECT_PATH)/build.
  • COMPONENT_DIRS:搜索组件的目录.默认为$(IDF_PATH)/components( idf 组件),$(PROJECT_PATH)/components(项目组件),$(PROJECT_PATH)/mainEXTRA_COMPONENT_DIRS (其他组件).如果您不想在这些位置搜索组件,请覆盖此变量.
  • EXTRA_COMPONENT_DIRS:用于搜索组件的其他目录的可选列表.
  • COMPONENTS:要构建到项目中的组件名称列表.默认为COMPONENT_DIRS目录中的所有组件.
  • EXCLUDE_COMPONENTS:在构建过程中要排除的组件名称的可选列表.请注意,这会减少构建时间,但不会减少二进制大小.
  • TEST_EXCLUDE_COMPONENTS:在单元测试的构建过程中要排除的可选组件名称列表.

这些 Makefile 变量中的任何路径都应该是绝对路径.您可以使用$(PROJECT_PATH)/ xxx,$(IDF_PATH)/ xxx转换相对路径,或使用 Make 函数$(abspath xxx).

这些都变量应该在 Makefile 中的 include $(IDF_PATH)/make/project.mk 行之前设置.

组件 Makefile

每个项目都包含一个或多个组件,这些组件可以是 esp-idf 的一部分,也可以从其他组件目录添加.

组件是包含 component.mk 文件的任何目录.

搜索组件

COMPONENT_DIRS中的目录列表中搜索项目的组件.此列表中的目录可以是组件本身(即它们包含 component.mk 文件),也可以是子目录为组件的顶级目录(包含组件的目录).

运行 make list-components 后,会输出这些变量,这可以帮助调试组件目录是否被找到.

具有相同名称的多个组件

当 esp-idf 找到所有要编译的组件时,它将按照 COMPONENT_DIRS 指定的顺序执行此操作; 默认情况下,首先是 idf 组件,第二个是项目组件,最后是 EXTRA_COMPONENT_DIRS 中的组件.如果这些目录中的两个或多个包含具有相同名称的组件子目录,则使用搜索的最后一个位置中的组件.例如,这允许通过简单地将组件从 esp-idf 组件目录复制到项目组件树然后在那里修改它来覆盖具有修改版本的 esp-idf 组件.如果以这种方式使用,esp-idf 目录本身可以保持不变.

最小组件 Makefile

最小的 component.mk 文件是一个空文件.如果文件为空,则设置默认组件行为:

  • 与 makefile 在相同的目录中的所有源文件(*.c,*.cpp,*.cc,*.S)将被编译到组件库中
  • 子目录 “include” 将被添加到所有其他组件的全局 include 搜索路径中.
  • 组件库将链接到项目应用程序中.

有关更完整的示例组件 makefile,请参阅[示例组件 makefile](#示例组件 Makefile).

请注意,空的 component.mk 文件(调用默认组件构建行为)和没有 component.mk 文件(这意味着不会发生默认组件构建行为)之间存在差异.组件可能没有 component.mk 文件,如果它只包含影响项目配置或构建过程的其他文件.

预设组件变量

以下特定组件的变量可在component.mk中使用,但不应修改:

  • COMPONENT_PATH:组件目录.计算包含 component.mk 的目录的绝对路径.组件路径不能包含空格.
  • COMPONENT_NAME:组件的名称.默认为组件目录的名称.
  • COMPONENT_BUILD_DIR:组件构建目录.计算 $(BUILD_DIR_BASE) 中要构建此组件源文件的目录的绝对路径.每次构建组件时,这也是当前工作目录,因此 make 等目标中的相对路径都是相对于此目录.
  • COMPONENT_LIBRARY:将为此组件构建的静态库文件的名称(相对于组件构建目录).默认为 $(COMPONENT_NAME).a.

以下变量在项目级别设置,但会导出在组件构建中使用:

  • PROJECT_NAME:项目名称,在项目 Makefile 中设置
  • PROJECT_PATH:包含项目 Makefile 的项目目录的绝对路径.
  • COMPONENTS:此构建中包含的所有组件的名称.
  • CONFIG_ *:项目配置中的每个值都有一个 make 中可用的对应变量.所有名称都以 CONFIG_ 开头.
  • CC,LD,AR,OBJCOPY:gcc xtensa 交叉工具链中每个工具的完整路径.
  • HOSTCC,HOSTLD,HOSTAR:来自主机本机工具链的每个工具的全名.
  • IDF_VER:ESP-IDF 版本,使用 git 命令 git describe$(IDF_PATH)/version.txt 文件(如果存在)中检索.这里推荐的格式是单独的一行指定主要 IDF 发布版本,例如标记版本的 v2.0 或任意提交的 v2.0-275-g0efaa4f.应用程序可以通过调用 esp_get_idf_version() 来使用它.
  • PROJECT_VER: 项目版本
    • 如果 PROJECT_VER 变量在项目 Makefile 文件中设置,则将使用其值。
    • 否则,如果 $PROJECT_PATH/version.txt 存在,其内容将用作 PROJECT_VER
    • 否则,如果项目位于 Git 存储库中,则将使用git describe的输出。
    • 否则,PROJECT_VER 将为“1”。

如果您修改 component.mk 中的任何这些变量,那么这不会阻止构建其他组件,但它可能使您的组件难以构建或者调试.

可选项目范围的组件变量

可以在 component.mk 中设置以下变量来控制整个项目中的构建设置:

  • COMPONENT_ADD_INCLUDEDIRS:相对于组件目录的路径,将添加到项目中所有组件的 “include” 搜索路径.如果未被覆盖,则默认include.如果仅需要编译此特定组件的 “include” 目录,请将其添加到 COMPONENT_PRIV_INCLUDEDIRS
  • COMPONENT_ADD_LDFLAGS:为 LDFLAGS 添加链接器参数以用于应用程序可执行文件.默认为 -l$(COMPONENT_NAME).如果将预编译库添加到此目录,请将它们添加为绝对路径 -e$(COMPONENT_PATH)/libwhatever.a
  • COMPONENT_DEPENDS:应在此组件之前编译的组件名称的可选列表.对于链接时依赖性,这不是必需的,因为所有组件"include"目录始终可用.如果一个组件生成一个"include"文件,然后您想要包含在另一个组件中,则这是必要的.大多数组件不需要设置此变量.
  • COMPONENT_ADD_LINKER_DEPS:相对组件路径的文件的可选列表,如果它们发生更改,应触发 ELF 文件的重新链接。 通常用于链接描述文件和二进制库。大多数组件不需要设置此变量。

以下变量仅适用于属于 esp-idf 本身的组件:

  • COMPONENT_SUBMODULES:组件使用的 git 子模块路径(相对于 COMPONENT_PATH)的可选列表.这些将由构建过程检查(并在必要时初始化).如果组件位于 IDF_PATH 目录之外,则忽略此变量.

可选特定的组件变量

可以在component.mk中设置以下变量来控制该组件的构建:

  • COMPONENT_PRIV_INCLUDEDIRS:目录路径,必须相对于组件目录,该组件目录将仅添加到此组件源文件的"include"搜索路径中.
  • COMPONENT_EXTRA_INCLUDES:编译组件源文件时使用的任何额外包含路径.这些将以’-I’为前缀,并按原样传递给编译器.与COMPONENT_PRIV_INCLUDEDIRS变量类似,但这些路径不会相对于组件目录进行扩展.
  • COMPONENT_SRCDIRS:目录路径,必须相对于组件目录,将用以搜索源文件(* .cpp,* .c,* .S).默认为’.’,即组件目录本身.覆盖它以指定包含源文件的不同目录列表.
  • COMPONENT_OBJS:要编译的对象文件.默认值是COMPONENT_SRCDIRS中找到的每个源文件的 a.o 文件.覆盖此列表允许您排除COMPONENT_SRCDIRS中的源文件,否则将被编译.请参阅指定源文件
  • COMPONENT_EXTRA_CLEAN:相对于组件构建目录的路径,使用component.mk文件中的自定义make规则生成的任何文件,以及作为make clean的一部分需要删除的文件.有关示例,请参阅源代码生成.
  • COMPONENT_OWNBUILDTARGETCOMPONENT_OWNCLEANTARGET:这些目标允许您完全覆盖组件的默认构建行为.有关详细信息,请参阅[完全覆盖组件 Makefile](#完全覆盖组件 Makefile).
  • COMPONENT_CONFIG_ONLY:如果设置,则此标志指示组件根本不生成任何内置输出(即未构建 COMPONENT_LIBRARY),并忽略大多数其他组件变量.此标志用于 IDF 内部组件,其中仅包含 KConfig.projbuild 和/或 Makefile.projbuild 文件以配置项目,但没有源文件.
  • CFLAGS:传递给 C 编译器的标志.根据项目设置定义一组默认 CFLAGS.可以通过 CFLAGS += 进行组件特定的添加.也可以(尽管不推荐)完全覆盖该组件的变量.
  • CPPFLAGS:传递给 C 预处理器的标志(用于. c , .cpp 和 .S 文件).根据项目设置定义一组默认的 CPPFLAGS.可以通过 CPPFLAGS += 进行组件特定的添加.也可以(尽管不推荐)完全覆盖该组件的变量.
  • CXXFLAGS:传递给 C++ 编译器的标志.根据项目设置定义一组默认的 CXXFLAGS.可以通过 CXXFLAGS += 进行组件特定的添加.也可以(尽管不推荐)完全覆盖该组件的变量.

要将编译标志应用于单个源文件,可以将变量覆盖添加为目标,即:

apps/dhcpserver.o: CFLAGS += -Wno-unused-variable
  • 1

组件配置

每个组件还可以有一个 Kconfig 文件,与 component.mk 在同一目录下.Kconfig 中包含要添加到此组件的 “make menuconfig” 的配置设置.

运行 menuconfig 时,可在 “Component Settings” 菜单下找到这些设置.

要创建组件 KConfig 文件,最简单的方法是使用 esp-idf 中的 KConfig 文件做修改.

有关示例,请参阅添加条件配置.

示例:添加二进制库、组件配置文件 Kconfig

在这里插入图片描述

#
# Component Makefile
#
ifdef CONFIG_BT_ENABLED

COMPONENT_SRCDIRS := .

COMPONENT_ADD_INCLUDEDIRS := include

add pre-compiled libraries

LIBS := btdm_app

COMPONENT_ADD_LDFLAGS := -lbt -L $(COMPONENT_PATH)/lib
(addprefixl,(addprefix -l,(LIBS))

re-link program if BT binary libs change

COMPONENT_ADD_LINKER_DEPS := (patsubst(patsubst %,(COMPONENT_PATH)/lib/lib%.a,$(LIBS))

COMPONENT_SUBMODULES += lib

ifeq ($(GCC_NOT_5_2_0), 1)

TODO: annotate fallthroughs in Bluedroid code with comments

CFLAGS += -Wno-implicit-fallthrough
endif

endif

ifdef CONFIG_BLUEDROID_ENABLED

COMPONENT_PRIV_INCLUDEDIRS += bluedroid/bta/include
bluedroid/bta/ar/include

COMPONENT_ADD_INCLUDEDIRS += bluedroid/api/include/api

COMPONENT_SRCDIRS += bluedroid/bta/dm
bluedroid/bta/gatt

ifeq ($(GCC_NOT_5_2_0), 1)
bluedroid/bta/sdp/bta_sdp_act.o: CFLAGS += -Wno-unused-const-variable
bluedroid/btc/core/btc_config.o: CFLAGS += -Wno-unused-const-variable
bluedroid/stack/btm/btm_sec.o: CFLAGS += -Wno-unused-const-variable
bluedroid/stack/smp/smp_keys.o: CFLAGS += -Wno-unused-const-variable
endif

endif

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

预处理器定义

ESP-IDF 构建系统在命令行上添加以下 C 预处理器定义:

  • ESP_PLATFORM - 可用于检测在 ESP-IDF 内发生的构建.
  • IDF_VER - ESP-IDF 版本,有关详细信息,请参阅预设组件变量.
  • PROJECT_VER:项目版本,有关详细信息,请参阅预设组件变量.
  • PROJECT_NAME:项目名称,在项目 Makefile 中设置.

构建过程内部

顶级:Project Makefile

  • “make” 总是从项目目录和项目 makefile 运行,通常名为 Makefile.
  • 项目 makefile 设置 PROJECT_NAME,并可选择自定义其他可选项目变量
  • 项目 makefile 包含 $(IDF_PATH)/make/project.mk,其中包含项目级的 Make 逻辑.
  • project.mk 填写默认的项目级 make 变量,并包含项目配置中的 make 变量.如果生成的包含项目配置的 makefile 已过期,则会重新生成(通过 project_config.mk 中的 targets),然后 make 进程从顶部重新开始.
  • project.mk 根据默认组件目录或可选项目变量中设置的自定义组件列表构建需要要构建的组件列表.
  • 每个组件都可以设置一些可选项目范围的组件变量.这些包含在 component_project_vars.mk 生成的 makefile 中 - 每个组件有一个.这些生成的 makefile 包含在 project.mk中.如果有任何缺失或过时,它们将被重新生成(通过对组件 makefile 的递归调用),然后 make 进程从顶部重新开始.
  • 组件中的 Makefile.projbuild 文件包含在 make 进程中,以添加额外的目标或配置.
  • 默认情况下,项目 makefile 还为每个组件生成顶级构建和清理目标,并设置 app 和 clean 目标以调用这些子目标.
  • 为了编译每个组件,对组件 makefile 执行递归 make.

为了更好地理解项目构建过程,请通读 project.mk 文件本身.

第二级:组件Makefile

  • 每次调用组件 makefile 都是通过 $(IDF_PATH)/make/component_wrapper.mk 包装器 makefile 进行的.
  • 此组件包装器包含所有组件 Makefile.componentbuild 文件,使这些文件中的任何配方,变量等可用于每个组件.
  • 调用component_wrapper.mk时将当前目录设置为组件构建目录,并将COMPONENT_MAKEFILE变量设置为component.mk的绝对路径.
  • component_wrapper.mk为所有组件变量设置默认值,然后包括可以覆盖或修改这些变量的component.mk文件.
  • 如果未定义 COMPONENT_OWNBUILDTARGETCOMPONENT_OWNCLEANTARGET,则会为组件的源文件和必备组件 COMPONENT_LIBRARY 静态库文件创建缺省构建和清除目标.
  • component_project_vars.mk 文件在 component_wrapper.mk 中有自己的目标,如果由于组件 makefile 或项目配置的更改而需要重建此文件,则从 project.mk 进行评估.

为了更好地理解组件制作过程,请通读 component_wrapper.mk 文件和 esp-idf 中包含的一些 component.mk 文件.

以非交互方式运行

在不希望交互式提示的情况下运行 make 时(例如:在 IDE 或自动构建系统中)将 BATCH_BUILD = 1 附加到 make 参数(或将其设置为环境变量).

设置 BATCH_BUILD 意味着以下内容:

  • 详细输出(与 V = 1 相同,见下文).如果您不想要详细输出,设置 V = 0.
  • 如果项目配置缺少新配置项(来自新组件或 esp-idf 更新),则项目使用默认值,而不是提示用户输入每个项目.
  • 如果构建系统需要调用menuconfig,则会打印错误并且构建失败.

高级 Make 用法

  • make appmake bootloadermake partition table 可用于仅根据需要从项目中构建 appbootloaderpartition table
  • make erase_flashmake erase_ota 将分别使用 esptool.py 从 Flash 中擦除整个 Flash 和 OTA 分区选择配置。
  • make size 打印有关应用程序的一些大小信息。make size-componentsmake size-files 是类似的目标,分别打印更详细的每个组件或每个源文件信息。

调试 Make Process

调试 esp-idf 构建系统的一些技巧:

  • V = 1 附加到 make 参数(或将其设置为环境变量)将使 make 回显所有已执行的命令,以及为 sub-make 输入的每个目录.
  • 运行 make -w 将导致 make 在为 sub-make 输入时回显每个目录 - 与 V = 1 相同但不回显所有命令.
  • 运行 make --trace (可能除了上述参数之一)将打印出构建时的每个目标,以及导致它构建的依赖项.
  • 运行 make -p 会打印每个 makefile 中每个生成的目标的(非常详细的)摘要.

有关更多调试技巧和一般制作信息,请参阅 GNU制作手册.

警告未定义的变量

默认情况下,如果引用了未定义的变量(如$(DOES_NOT_EXIST)),构建过程将打印警告.这对于查找变量名称中的错误非常有用.

如果您不想要此行为,可以在 SDK 工具配置下的 menuconfig 顶级菜单中禁用它.

请注意,如果在 Makefile 中使用ifdefifndef,则此选项不会触发警告.

覆盖项目的部分内容

Makefile.projbuild

对于具有必须在顶级项目 make pass 中进行求值的构建要求的组件,可以在组件目录中创建名为 Makefile.projbuild 的文件.在计算 project.mk 时会包含此 makefile.

例如,如果您的组件需要为整个项目添加 CFLAGS (不仅仅是为了自己的源文件),那么您可以在 Makefile.projbuild 中设置 CFLAGS +=.

Makefile.projbuild 文件在 esp-idf 中大量使用,用于定义项目范围的构建功能,例如 esptool.py 命令行参数和 bootloader “特殊应用程序”.

请注意,Makefile.projbuild 对于最常见的组件使用不是必需的 - 例如向项目添加 include 目录,或者将 LDFLAGS 添加到最终链接步骤.可以通过 component.mk 文件本身自定义这些值.有关详细信息,请参阅可选项目范围的组件变量.

在此文件中设置变量或目标时要小心.由于这些值包含在顶级项目 makefile 中,因此它们可以影响或破坏所有组件的功能!

KConfig.projbuild

这相当于 Makefile.projbuild 的组件配置 KConfig 文件.如果要在 menuconfig 的顶层包含配置选项,而不是在 “Component Configuration” 子菜单中,则可以在 component.mk 文件旁边的 KConfig.projbuild 文件中定义这些选项.

在此文件中添加配置值时要小心,因为它们将包含在整个项目配置中.在可能的情况下,通常最好为组件配置创建 KConfig 文件.

Makefile.componentbuild

对于组件例如,包括从其他文件生成源文件的工具,必须能够将配置,宏或变量定义添加到每个组件的组件构建过程中.这是通过在组件目录中包含 Makefile.componentbuild 来完成的.在包含组件的 component.mk 之前,此文件会包含在 component_wrapper.mk 中.与 Makefile.projbuild 类似,请注意这些文件:因为它们包含在每个组件构建中,所以只有在编译完全不同的组件时才会出现 Makefile.componentbuild 错误.

仅配置组件

一些不包含源文件的特殊组件,只有 Kconfig.projbuildMakefile.projbuild,可以在 component.mk 文件中设置标志 COMPONENT_CONFIG_ONLY.如果设置了此标志,则忽略大多数其他组件变量,并且不会为组件运行构建步骤.

示例组件 Makefile

因为构建环境试图设置大多数时间都能工作的合理默认值,所以 component.mk 可能非常小甚至是空的(请参阅最小组件 Makefile).但是,某些功能通常需要覆盖组件变量.

以下是component.mk makefile 的一些更高级的示例:

添加源文件目录

默认情况下,将忽略子目录.如果您的项目在子目录而不是组件的根目录中有源文件,那么您可以通过设置COMPONENT_SRCDIRS 告诉构建系统:

COMPONENT_SRCDIRS:= src1 src2
  • 1

这将编译 src1/ 和 src2/ 子目录中的所有源文件.

指定源文件

标准 component.mk 逻辑将源目录中的所有 .S 和 .c 文件添加为无条件编译的源.通过将 COMPONENT_OBJS 变量手动设置为需要生成的对象的名称,可以绕过该逻辑并对要编译的对象进行硬编码:

COMPONENT_OBJS := file1.o file2.o thing/filea.o thing/fileb.o anotherthing/main.o
COMPONENT_SRCDIRS := . thing anotherthing
  • 1
  • 2

请注意,还必须设置 COMPONENT_SRCDIRS.

添加条件配置

配置系统可有条件地编译某些文件,具体取决于 make menuconfig 中选择的选项.为此, ESP-IDF 具有 compile_only_ifcompile_only_if_not 宏:

Kconfig:

config FOO_ENABLE_BARbool "Enable the BAR feature."helpThis enables the BAR feature of the FOO component.
  • 1
  • 2
  • 3
  • 4

component.mk:

$(call compile_only_if,$(CONFIG_FOO_ENABLE_BAR),bar.o)
  • 1

从示例中可以看出,compile_only_if 宏将条件和目标文件列表作为参数.如果条件为真(在这种情况下:如果在 menuconfig 中启用了 BAR 功能),将始终编译目标文件(在本例中为 bar.o).相反的情况也是如此:如果条件不成立, bar.o 将永远不会被编译.compile_only_if_not 执行相反的操作:如果条件为false则编译,如果条件为 true 则不编译.

这也可用于选择或删除一种实现,如下所示:

Kconfig:

config ENABLE_LCD_OUTPUTbool "Enable LCD output."helpSelect this if your board has a LCD.

config ENABLE_LCD_CONSOLE
bool “Output console text to LCD”
depends on ENABLE_LCD_OUTPUT
help
Select this to output debugging output to the lcd

config ENABLE_LCD_PLOT
bool “Output temperature plots to LCD”
depends on ENABLE_LCD_OUTPUT
help
Select this to output temperature plots

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

component.mk:

# If LCD is enabled, compile interface to it, otherwise compile dummy interface
$(call compile_only_if,$(CONFIG_ENABLE_LCD_OUTPUT),lcd-real.o lcd-spi.o)
$(call compile_only_if_not,$(CONFIG_ENABLE_LCD_OUTPUT),lcd-dummy.o)

#We need font if either console or plot is enabled
(callcompileonlyif,(call compile_only_if,(or (CONFIGENABLELCDCONSOLE),(CONFIG_ENABLE_LCD_CONSOLE),(CONFIG_ENABLE_LCD_PLOT)), font.o)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

请注意使用 Make ‘or’ 功能来包含字体文件.其他替换函数,如 ‘and’ 以及 ‘if’ 也适用于此处.也可以使用不来自 menuconfig 的变量: ESP-IDF 使用默认的构建配置来判断一个空的变量或只包含空格为false,而其中包含任何非空格的变量为true.

(注意:本文档的旧版本建议有条件地将目标文件名添加到 COMPONENT_OBJS.虽然这仍然可行,但只有当组件的所有目标文件都明确命名时才会起作用,并且不会通过 make clear 中的取消选择的目标文件通过.)

源代码生成

某些组件将出现源文件未随组件本身提供但必须从另一个文件生成的情况.假设我们的组件有一个头文件,该文件由 BMP 文件的转换后的二进制数据组成,使用名为 bmp2h 的假设工具进行转换.然后将头文件包含在名为 graphics_lib.c 的 C 源文件中:

COMPONENT_EXTRA_CLEAN := logo.h

graphics_lib.o: logo.h

logo.h: $(COMPONENT_PATH)/logo.bmp
bmp2h -i $^ -o $@

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在此示例中,将在当前目录(构建目录)中生成 graphics_lib.ologo.h,而 logo.bmp 随组件一起提供并位于组件路径下.因为 logo.h 是一个生成的文件,所以当调用 make clean 时需要清理它,这就是为什么它被添加到 COMPONENT_EXTRA_CLEAN 变量中.

Cosmetic Improvements

因为 logo.h 是一个生成的文件,所以当调用 make clean 时需要清理它,这就是为什么它被添加到 COMPONENT_EXTRA_CLEAN 变量中.

将 logo.h 添加到 graphics_lib.o 依赖项会导致在编译 graphics_lib.c 之前生成它.

如果另一个组件中的源文件包含 logo.h,则必须将此组件的名称添加到另一个组件的 COMPONENT_DEPENDS 列表中,以确保组件按顺序构建.

嵌入二进制数据

有时您有一个文件,包含组件需要使用的二进制数据或文本数据 - 但您不希望将文件重新格式化为 C 文件.

您可以在 component.mk 中设置变量 COMPONENT_EMBED_FILES,以这种方式给出要嵌入的文件的名称:

COMPONENT_EMBED_FILES:= server_root_cert.der
  • 1

或者,如果文件是字符串,则可以使用变量 COMPONENT_EMBED_TXTFILES.这将把文本文件的内容嵌入为以 null 结尾的字符串:

COMPONENT_EMBED_TXTFILES:= server_root_cert.pem
  • 1

文件的内容将被添加到 flash 中的 .rodata 部分,并通过符号名称提供,如下所示:

extern const uint8_t server_root_cert_pem_start [] asm(“_ binary_server_root_cert_pem_start”);
extern const uint8_t server_root_cert_pem_end [] asm(“_ binary_server_root_cert_pem_end”);
  • 1
  • 2

名称是根据文件的全名生成的,如 COMPONENT_EMBED_FILES 中所示.字符 /,.等用下划线代替.符号名称中的 _binary 前缀由 objcopy 添加,对于文本和二进制文件都是相同的.

有关使用此技术的示例,请参阅protocols/https_request-证书文件内容在编译时从文本 .pem 文件加载.

完全覆盖组件 Makefile

显然,在某些情况下,所有这些不足以满足某个组件,例如,当组件基本上是另一个第三方组件的包装器时,该第三方组件最初不打算在此构建系统下编译.在这种情况下,可以通过设置 COMPONENT_OWNBUILDTARGET 和可能的 COMPONENT_OWNCLEANTARGET 并在 component.mk 目标中定义名为 buildclean 的自己的目标来完全放弃 esp-idf 构建系统.构建目标可以执行任何操作,只要它为项目生成过程创建 $(COMPONENT_LIBRARY) 以链接到应用程序二进制文件.

(实际上,即使这不是必需的-如果重写 COMPONENT_ADD_LDFLAGS 变量,则组件可以指示链接器链接其他二进制文件.)

自定义 sdkconfig 默认值

例如,您不希望指定完整 sdkconfig 配置的项目或其他项目,但您确实希望覆盖 esp-idf 默认值中的某些键值,则可以在项目目录中创建文件 sdkconfig.defaults.运行 make defconfig 或从头创建新配置时将使用此文件.

要覆盖此文件的名称,请设置 SDKCONFIG_DEFAULTS 环境变量.

保存 flash 参数

在某些情况下,我们希望在没有 IDF 的情况下烧写目标板.对于这种情况,我们希望保存构建的二进制文件, esptool.pyesptool write_flash 参数.编写脚本以保存二进制文件和 esptool.py 很简单.我们可以使用命令 make print_flash_cmd,它会打印 flash 参数:

--flash_mode dio --flash_freq 40m --flash_size detect 0x1000 bootloader / bootloader.bin 0x10000 example_app.bin 0x8000 partition_table_unit_test_app.bin
  • 1

然后使用 flash 参数作为 esptool write_flash 参数的 arguemnts:

python esptool.py --chip esp32 --port / dev / ttyUSB0 --baud 921600 - before default_reset - after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 bootloader / bootloader.bin 0x10000 example_app .bin 0x8000 partition_table_unit_test_app.bin
  • 1

构建 Bootloader

引导程序默认构建为 “make all” 的一部分,或者可以通过 “make bootloader-clean” 独立构建.还有 “make bootloader-list-components” 来查看引导加载程序构建中包含的组件.

IDF components/bootloader 中的组件是特殊的,因为第二阶段引导加载程序是主项目的单独.ELF和.BIN文件.但是,它与主项目共享其配置和构建目录.

这是通过在 components/bootloader/subproject 下添加子项目来完成的.这个子项目有自己的 Makefile,但它希望通过 components/bootloader/Makefile.projectbuild 文件中的一些粘合剂从项目自己的 Makefile 中调用.有关详细信息,请参阅这些文件

原文链接

                                </div><link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-b6c3c6d139.css" rel="stylesheet"><div class="more-toolbox"><div class="left-toolbox"><ul class="toolbox-list"><li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true"><use xlink:href="#csdnc-thumbsup"></use></svg><span class="name">点赞</span><span class="count">5</span></a></li><li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;popu_824&quot;}"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-csdnc-Collection-G"></use></svg><span class="name">收藏</span></a></li><li class="tool-item tool-active is-share"><a href="javascript:;"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-csdnc-fenxiang"></use></svg>分享</a></li><!--打赏开始--><!--打赏结束--><li class="tool-item tool-more"><a><svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg></a><ul class="more-box"><li class="item"><a class="article-report">文章举报</a></li></ul></li></ul></div></div><div class="person-messagebox"><div class="left-message"><a href="https://blog.csdn.net/qq_27114397"><img src="https://profile.csdnimg.cn/F/2/C/3_qq_27114397" class="avatar_pic" username="qq_27114397"><img src="https://g.csdnimg.cn/static/user-reg-year/1x/5.png" class="user-years"></a></div><div class="middle-message"><div class="title"><span class="tit"><a href="https://blog.csdn.net/qq_27114397" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}" target="_blank">InfiniteYuan</a></span><span class="flag expert"><a href="https://blog.csdn.net/home/help.html#classicfication" target="_blank"><svg class="icon" aria-hidden="true"><use xlink:href="#csdnc-blogexpert"></use></svg>博客专家</a></span></div><div class="text"><span>发布了127 篇原创文章</span> · <span>获赞 284</span> · <span>访问量 26万+</span></div></div><div class="right-message"><a href="https://im.csdn.net/im/main.html?userName=qq_27114397" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信</a><a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}">关注</a></div></div></div>
明耀
发布了195 篇原创文章 · 获赞 10 · 访问量 3万+
私信关注
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 《Linux系统调用:C库函数》

    待整理!点赞收藏分享文章举报HarkerYX发布了383 篇原创文章 获赞 134 访问量 32万+私信关注...

    2024/4/23 5:00:17
  2. 后台设计

    点赞收藏分享文章举报圣英神士发布了473 篇原创文章 获赞 43 访问量 28万+他的留言板关注...

    2024/4/21 0:01:42
  3. Grafana+Prometheus实现服务器监控----------window版

    一:介绍Prometheus官网是这么介绍,一个最初在SoundCloud上构建的开源系统监视和警报工具包。 Prometheus是一个完整的监控和趋势系统,包括基于时间序列数据的内置和主动抓取,存储,查询,绘图和警报。 简单来说,我们可以用Prometheus来监控包括linux,window系统,nginx以…...

    2024/4/26 2:09:22
  4. 0537-5.15.0-查询Parquet格式表异常问题

    1 诡异现象 在Fayson的测试测试环境下有一张Parquet格式的表,由于业务需要对表的字段名称数据类型进行了修改和新增列等操作,导致使用Hive和Impala查询显示的结果不一致问题。 Impala查询表时由于数据类型问题直接抛出异常: WARNINGS: File hdfs://nameservice1/user/hive/w…...

    2024/4/20 1:00:46
  5. java 生成随机字母数字组合

    import java.util.Random; public class RandomTest { /** * 方法1:生成随机数字和字母组合 * @param length * @return */ public static String getCharAndNumr(int length) { Random random = new Random(); StringBuffer valSb = new StringBuffer(); String char…...

    2024/4/25 7:35:47
  6. python基础_格式化输出(%用法和format用法)

    本文转载自:http://www.cnblogs.com/fat39/p/7159881.html 作者:fat39 转载请注明该声明。目录 %用法 format用法 %用法 1、整数的输出 %o —— oct 八进制%d —— dec 十进制%x —— hex 十六进制 1 >>> print(%o % 20) 2 24 3 >>> print(%d % 20) …...

    2024/4/23 4:59:48
  7. Kafka 基本原理

    《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与源码解析 —— 精品合集》《Spring Boot 实现原理与源码解析 —— 精品合集》《数据库实…...

    2024/4/25 20:11:24
  8. 如何提升你的数据结构、算法以及解决问题的能力

    如何提升你的数据结构、算法以及解决问题的能力 这篇文章借鉴了我过去在学校一个学期的个人经历和挑战,当我进入学校的时候,我对任何 DSA(数据结构和算法)和解决问题的策略几乎一无所知。作为一名自学成才的程序员,我对一般编程会更加熟悉和舒适,例如面向对象编程,而不是…...

    2024/4/21 13:39:03
  9. 定时任务crontab

    crontab:定时任务的守护进程,精确到分,设计秒的我们一般写脚本 -->相当于闹钟日志文件: ll /var/log/cron*编辑文件: vim /etc/crontab 进程:ps -ef | grep crond ==> /etc/init.d/crond restart作用:定时备份,实时备份常见命令参数12345678usage: cron…...

    2024/4/23 3:41:11
  10. JS 常用正则表达式

    验证数字:^[0-9]*$ 验证n位的数字:^\d{n}$ 验证至少n位数字:^\d{n,}$ 验证m-n位的数字:^\d{m,n}$ 验证零和非零开头的数字:^(0|[1-9][0-9]*)$ 验证有两位小数的正实数:^[0-9]+(.[0-9]{2})?$ 验证有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$ 验证非零的正整数:^\+?[…...

    2024/4/25 2:54:09
  11. QT 子窗口关闭时,不执行析构函数

    子窗体的构造函数中初始化了父窗体的parent,当关闭子窗体时不会调用析构函数,只有关闭父窗体时,才会调用子窗体的析构函数,解决办法如下setAttribute(Qt::WA_DeleteOnClose);写在子窗体的构造函数就可以了~点赞收藏分享文章举报qq_40041064发布了32 篇原创文章 获赞 1 访…...

    2024/4/26 1:02:36
  12. Vue的组件为什么要export default

    Vue 的模块机制Vue 是通过 webpack 实现的模块化,因此可以使用 import 来引入模块,例如:此外,你还可以在 bulid/webpack.base.conf.js 文件中修改相关配置:意思是,你的模块可以省略 ".js",".vue",“.json” 后缀,weebpack 会在之后自动添加上;可…...

    2024/4/25 1:18:12
  13. 我把废旧 Android 手机改造成了 Linux 服务器

    ▋目录瞎比比什么都别说,先看看效果怎样?需要什么材料、设备?root 手机为 Android 手机装上 Linux 系统最后▋瞎比比自从没有了学生身份之后,购买云服务器的价格是越来越贵了,不管是阿里云还是腾讯云。我寻思着能不能找到什么替代品,这让我想起之前在知乎不经意看到的,可…...

    2024/4/23 3:41:34
  14. python画图

    点赞收藏分享文章举报zjpp2580369发布了202 篇原创文章 获赞 23 访问量 4万+私信关注...

    2024/4/10 23:18:18
  15. 巧用Java8中的Stream,让集合操作飞起来!

    简介java8也出来好久了,接口默认方法,lambda表达式,函数式接口,Date API等特性还是有必要去了解一下。比如在项目中经常用到集合,遍历集合可以试下lambda表达式,经常还要对集合进行过滤和排序,Stream就派上用场了。用习惯了,不得不说真的很好用。Stream作为java8的新特…...

    2024/4/23 19:57:45
  16. EasyRTMP获取H.264实时流并转化成为RTMP直播推流之EasyRTMP-iOS如何处理H264关键帧和SPS、PPS数据的

    视频流媒体中视频数据的传输占据了绝大部分的带宽,如何提升编码效率、减小带宽使用、提升画面质量,成为音视频开发者努力的重点。随着互联网、流媒体技术的发展,兼容支持H.264、H.265编码器(可减少计算的复杂性、提高压缩率,并降低编码时间)已经成为迫在眉睫的事。EasyRT…...

    2024/4/25 10:27:11
  17. webuploader解决大文件断点续传

    文件夹数据库处理逻辑public class DbFolder{JSONObject root;public DbFolder(){this.root = new JSONObject();this.root.put("f_id", "");this.root.put("f_nameLoc", "根目录");this.root.put("f_pid", "");t…...

    2024/4/23 4:15:27
  18. java 如何做 API 接口防刷??

    首先需要写一个注解类 连接器中的实现 注册到springboot中 在Controller中加入到注解首先是写一个注解类: import java.lang.annotation.Retention; import java.lang.annotation.Target;import static java.lang.annotation.ElementType.METHOD; import static java.lang.ann…...

    2024/4/24 12:48:40
  19. 异常的三个部分

    异常分三个部分 1,产生异常 new 一个异常类的对象 2, 抛出异常 throw new ParseException(); 这代码抛在本地 3, 解决异常对象 try{ }catch(){ }finally{ } 在方法后面加 throws , 这才是将异常对象 抛出去。 链接: link. 图片: 带尺寸的图片: 居中的图片: 居中并且…...

    2024/4/9 10:52:38
  20. 什么是网络爬虫?有什么用?

    一、什么是网络爬虫随着大数据时代的来临,网络爬虫在互联网中的地位将越来越重要。 互联网中的数据是海量的,如何自动高效地获取互联网中我们感兴趣的信息并为我们所用是一个重要的问题,而爬虫技术就是为了解决这些问题而生的。我们感兴趣的信息分为不同的类型:如果只是做搜…...

    2024/4/25 13:24:41

最新文章

  1. Java在区块链开发中的作用及发展

    Java在区块链开发中的作用以及发展 一、引言 随着信息技术的飞速发展&#xff0c;区块链技术作为一种新兴的去中心化分布式账本技术&#xff0c;正逐渐引起人们的广泛关注。区块链以其独特的不可篡改、去中心化、安全可信等特性&#xff0c;在数字货币、供应链管理、金融科技…...

    2024/4/26 11:33:41
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. C# 构建可定时关闭的异步提示弹窗

    C# 构建可定时关闭的异步提示弹窗 引言1、调用接口的实现2、自动定时窗口的实现 引言 我们在最常用最简单的提示弹框莫过于MessageBox.Show( )的方法了&#xff0c;但是使用久了之后&#xff0c;你会发现这个MessageBox并不是万能的&#xff0c;有事后并不想客户去点击&#x…...

    2024/4/23 6:37:29
  4. 图像处理相关知识 —— 椒盐噪声

    椒盐噪声是一种常见的图像噪声类型&#xff0c;它会在图像中随机地添加黑色&#xff08;椒&#xff09;和白色&#xff08;盐&#xff09;的像素点&#xff0c;使图像的质量降低。这种噪声模拟了在图像传感器中可能遇到的问题&#xff0c;例如损坏的像素或传输过程中的干扰。 椒…...

    2024/4/23 15:25:06
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/25 11:51:20
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/25 18:39:24
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/25 18:38:39
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/25 18:39:23
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/25 18:39:22
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/25 18:39:22
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/25 18:39:20
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/25 16:48:44
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/25 13:39:44
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/25 18:39:16
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/25 0:00:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/25 4:19:21
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/25 18:39:12
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/25 2:10:52
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/25 13:19:01
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/25 18:38:58
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/25 18:38:57
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57