OpenWrt源码目录

2023-11-11

  分析的OpenWrt源码目录有助于分析OpenWrt的源码

一、原始目录

在这里插入图片描述

1.1、scripts

  构建期间用到的各类脚本文件。它存放了一些脚本,使用了bash,python,perl等多种脚本语言.编译过程中,用于第三方软件包管理的feeds文件也是在这个目录当中.在编译过程中,使用到的脚本也统一放在这个目录中.
  例如patch-kernel.sh封装了patch命令,在编译时,首先将 patches 目录下的所有补丁文件打上,并且判断如果打补丁失败将退出编译过程。
  download.pl 为下载源代码的工具脚本,封装下载工具 wget 的选项以及设置从哪里下载。
在这里插入图片描述

1.2、tools

  在构建过程中使用的各种工具。编译时,主机需要使用一些工具软件,tools 里包含了获取和编译这些工具的命令.软件包里面有Makefile文件,有的还包含了patch.每个Makefile当中都有一句$(eval $(call HostBuild)),这表明编译这个工具是为了在主机上使用的.

1.3、config

  菜单设置配置文件。存放着整个系统的配置文件

1.4、 toolchain

  构建工具链所需的生成文件和配置。这个文件中存放的就是编译交叉编译链的软件包.包括:binutils,gcc,libc等等.

1.5、target

   构建imagebuilder,内核,sdk和工具链所需的生成文件和配置。openwrt的源码可以编译出各个平台适用的二进制文件,各平台在这个目录里定义了firmware和kernel的编译过程。
   存放用于编译各类平台使用的二进制文件,定义了各类平台编译固件和内核的具体过程。
是指目标嵌入式设备,针对不同的平台有不同的特性代码。
   例如下面的“target/linux”目录是对Linux系统的划分,目录下包括Linux系统针对于各种平台标准内核的不订及特殊配置(如ar7、arm系统)。

1.6、package

  用于文件生成和菜单配置的软件包。存放了openwrt系统中适用的软件包,包含针对各个软件包的Makefile。openwrt定义了一套Makefile模板.各软件参照这个模板定义了自己的信息,如软件包的版本、下载地址、编译方式、安装地址等。在二次开发过程中,这个文件夹我们会经常打交道.
  事实上,通过./scripts/feed update -a和./scripts/feed install -a的软件包也会存放在这个目录之中.
  我们可以根据自己的需求,在这个目录下新建目录(根据软件类型存放在对应的目录下),然后编写程序和Makefile脚本,这样就可以编译生成自己想要的软件了。

1.7、include

  文件生成配置文件。openwrt的Makefile都存放在这里。文件名为 *.mk 。这里的文件上是在Makefile里被include的,类似于库文件.这些文件定义了编译过程.
.mk脚本在编译时的作用
  在顶层目录下有一个“Makefile”脚本,当我们在编译源码时,输入make命令,“Makefile”脚本被执行,紧接着.mk脚本会被顶级目录下的Makefile调用,然后这些.mk脚本会解析“.config”文件(.config文件下面有介绍),并且根据“.config”文件的内容来编译相关的内容(例如下载、编译安装packages目录下的第三方软件等)。

二、原始目录下的单个文件

2.1、Makefile:

  在顶层目录执行make命令的入口文件。进行编译的总体工作。自己开发时,这个Makefile不需要改动。make文件如下:

# SPDX-License-Identifier: GPL-2.0-only
#
# Copyright (C) 2007 OpenWrt.org

TOPDIR:=${CURDIR}
LC_ALL:=C
LANG:=C
TZ:=UTC
export TOPDIR LC_ALL LANG TZ

empty:=
space:= $(empty) $(empty)
$(if $(findstring $(space),$(TOPDIR)),$(error ERROR: The path to the OpenWrt directory must not include any spaces))

world:

DISTRO_PKG_CONFIG:=$(shell $(TOPDIR)/scripts/command_all.sh pkg-config | grep '/usr' -m 1)

export ORIG_PATH:=$(if $(ORIG_PATH),$(ORIG_PATH),$(PATH))
export PATH:=$(if $(STAGING_DIR),$(abspath $(STAGING_DIR)/../host/bin),$(TOPDIR)/staging_dir/host/bin):$(PATH)

ifneq ($(OPENWRT_BUILD),1)
  _SINGLE=export MAKEFLAGS=$(space);

  override OPENWRT_BUILD=1
  export OPENWRT_BUILD
  GREP_OPTIONS=
  export GREP_OPTIONS
  CDPATH=
  export CDPATH
  include $(TOPDIR)/include/debug.mk
  include $(TOPDIR)/include/depends.mk
  include $(TOPDIR)/include/toplevel.mk
else
  include rules.mk
  include $(INCLUDE_DIR)/depends.mk
  include $(INCLUDE_DIR)/subdir.mk
  include target/Makefile
  include package/Makefile
  include tools/Makefile
  include toolchain/Makefile

$(toolchain/stamp-compile): $(tools/stamp-compile) $(if $(CONFIG_BUILDBOT),toolchain_rebuild_check)
$(target/stamp-compile): $(toolchain/stamp-compile) $(tools/stamp-compile) $(BUILD_DIR)/.prepared
$(package/stamp-compile): $(target/stamp-compile) $(package/stamp-cleanup)
$(package/stamp-install): $(package/stamp-compile)
$(target/stamp-install): $(package/stamp-compile) $(package/stamp-install)
check: $(tools/stamp-check) $(toolchain/stamp-check) $(package/stamp-check)

printdb:
	@true

prepare: $(target/stamp-compile)

_clean: FORCE
	rm -rf $(BUILD_DIR) $(STAGING_DIR) $(BIN_DIR) $(OUTPUT_DIR)/packages/$(ARCH_PACKAGES) $(TOPDIR)/staging_dir/packages

clean: _clean
	rm -rf $(BUILD_LOG_DIR)

targetclean: _clean
	rm -rf $(TOOLCHAIN_DIR) $(BUILD_DIR_BASE)/hostpkg $(BUILD_DIR_TOOLCHAIN)

dirclean: targetclean clean
	rm -rf $(STAGING_DIR_HOST) $(STAGING_DIR_HOSTPKG) $(BUILD_DIR_BASE)/host
	rm -rf $(TMP_DIR)
	$(MAKE) -C $(TOPDIR)/scripts/config clean

toolchain_rebuild_check:
	$(SCRIPT_DIR)/check-toolchain-clean.sh

cacheclean:
ifneq ($(CONFIG_CCACHE),)
	$(STAGING_DIR_HOST)/bin/ccache -C
endif

ifndef DUMP_TARGET_DB
$(BUILD_DIR)/.prepared: Makefile
	@mkdir -p $$(dirname $@)
	@touch $@

tmp/.prereq_packages: .config
	unset ERROR; \
	for package in $(sort $(prereq-y) $(prereq-m)); do \
		$(_SINGLE)$(NO_TRACE_MAKE) -s -r -C package/$$package prereq || ERROR=1; \
	done; \
	if [ -n "$$ERROR" ]; then \
		echo "Package prerequisite check failed."; \
		false; \
	fi
	touch $@
endif

# check prerequisites before starting to build
prereq: $(target/stamp-prereq) tmp/.prereq_packages
	@if [ ! -f "$(INCLUDE_DIR)/site/$(ARCH)" ]; then \
		echo 'ERROR: Missing site config for architecture "$(ARCH)" !'; \
		echo '       The missing file will cause configure scripts to fail during compilation.'; \
		echo '       Please provide a "$(INCLUDE_DIR)/site/$(ARCH)" file and restart the build.'; \
		exit 1; \
	fi

$(BIN_DIR)/profiles.json: FORCE
	$(if $(CONFIG_JSON_OVERVIEW_IMAGE_INFO), \
		WORK_DIR=$(BUILD_DIR)/json_info_files \
			$(SCRIPT_DIR)/json_overview_image_info.py $@ \
	)

json_overview_image_info: $(BIN_DIR)/profiles.json

checksum: FORCE
	$(call sha256sums,$(BIN_DIR),$(CONFIG_BUILDBOT))

buildversion: FORCE
	$(SCRIPT_DIR)/getver.sh > $(BIN_DIR)/version.buildinfo

feedsversion: FORCE
	$(SCRIPT_DIR)/feeds list -fs > $(BIN_DIR)/feeds.buildinfo

diffconfig: FORCE
	mkdir -p $(BIN_DIR)
	$(SCRIPT_DIR)/diffconfig.sh > $(BIN_DIR)/config.buildinfo

buildinfo: FORCE
	$(_SINGLE)$(SUBMAKE) -r diffconfig buildversion feedsversion

prepare: .config $(tools/stamp-compile) $(toolchain/stamp-compile)
	$(_SINGLE)$(SUBMAKE) -r buildinfo

world: prepare $(target/stamp-compile) $(package/stamp-compile) $(package/stamp-install) $(target/stamp-install) FORCE
	$(_SINGLE)$(SUBMAKE) -r package/index
	$(_SINGLE)$(SUBMAKE) -r json_overview_image_info
	$(_SINGLE)$(SUBMAKE) -r checksum
ifneq ($(CONFIG_CCACHE),)
	$(STAGING_DIR_HOST)/bin/ccache -s
endif

.PHONY: clean dirclean prereq prepare world package/symlinks package/symlinks-install package/symlinks-clean

endif

  (1)、执行make时,如果不指定任何目标,因为world目标处于第一位,所以默认执行world。
  (2)、在make时不指定OPENWRT_BUILD参数时,进入ifneq语句,如果编译时make OPENWRT_BUILD=1则进入else。ifneq语句主要工作为:
    重写OPENWRT_BUILD变量并export导出OPENWRT_BUILD变量。
    包含仅顶级目录下include目录下的debug.mk、depends.mk、toplevel.mk。
    debug.mk:在编译过程中各类信息的输出 (V=s参数用到)。
    depends.m:检查当前系统在编译内核阶段所有需要依赖的包是否安装。
    toplevel.mk:解析编译world目标的规则。
  (3)、“make clean”:删除编译目录。
  (4)、“make dirclean”:除了删除编译目录之外还删除编译工具目录。
  (5)、“make printdb”:输出所有的编译变量定义。

2.2 、rules.mk

  定义了Makefile中使用的一些通用变量和函数

2.3、 Config.in

  在include/toplevel.mk中我们可以看到,这是和make menuconfig相关联的文件.

2.4、 feeds.conf.default

  是下载第三方一些软件包时所使用的地址

2.5、 LICENSE & README

  即软件许可证和软件基本说明.其中README描述了编译软件的基本过程和依赖文件.

三、生成目录

  在我们编译完成后除了下载的源码文件,多出来的部分很明显就是编译过程中新生成的。编译工具链、目标平台的软件包等需要下载的文件都放在dl目录下。目标平台和软件包两部分都需要“build_dir/”作为编译的临时目录,并且会将目录 staging_dir作为编译的临时安装目录,最终的生成文件保存在目录bin下。
在这里插入图片描述

3.1、feeds

  openwrt的附加软件包管理器的扩展包索引目录.有点绕,简单来说就是下载管理软件包的.默认的feeds下载有packages、management、luci、routing、telephony。如要下载其他的软件包,需打开源码根目录下面的feeds.conf.default文件,去掉相应软件包前面的#号,然后更新源。
  在OpenWrt固件中,几乎所有东西都是软件包(package),可以编译为以“.ipk”结尾的安装包,这样就可以很方便地安装、升级和卸载了。注意,扩展软件包不是在主分支中维护的,但是可以使用软件包编译扩展机制(feeds)来进行扩展安装。这些包能够扩展基本系统的功能,只需要将它们链接进入主干。之后,这些软件包将会显示在编译配置菜单中。
  目录feeds用于保存扩展软件包,可以使用软件包编译扩展机制来进行扩展安装。这些包能够扩展基本系统的功能,只需要将它们链接进入编译主目录的package目录下。 之后,这些软件包将会显示在配置菜单中。
  ./sripts/feeds install -a时,feeds目录就产生了,安装的软件就存放在这个目录下了。

./scripts/feeds update -a

  安装下载好的包:

./scripts/feeds install -a

3.2、build_dir

  在前面的原始目录中,我们提到了host工具,toolchain工具还有目标文件.openwrt将在这个目录中展开各个软件包,进行编译.所以这个文件夹中包含3个子文件夹:
“build_dir/host”是一个临时目录,用来储存不依赖于目标平台的工具。tools目录中各类工具编译的结果存放在host中,因此可以看到这些目录的名称与tools下的工具名称相同。
“build_dir/toolchain-*”目录,用来储存依赖于指定平台的编译工具链。tools-chain目录交叉编译工具最终编译的结果文件。
“build_dir/”目录:目标平台和软件包两部分都需要“build_dir/”作为编译的临时目录。

3.2.1、 host

  在该文件夹中编译主机使用的工具软件

3.2.2 、toolchain-XXX

  在该文件夹中编译交叉工具链

3.2.3、 target-XXX

  在此编译目标平台的目标文件,包括各个软件包和内核文件.

3.3、bin

  保存编译完成后的二进制文件,包括:完整的bin文件,所有的ipk文件.

3.4、.dl

  在编译过程中使用的很多软件,刚开始下载源码并没有包含,而是在编译过程中从其他服务器下载的,这里是统一的保存目录。
  编译工具链、目标平台的软件包等需要下载的文件都放在dl目录下。
  在编译过程中,各类需要下载的包都保存在这个目录下 (编译过程中用的工具)。
  当编译的过程中,如果出错,出错的原因是某个软件包下载错误或丢失,可以手动下载对应的软件包(压缩文件形式),并放在这个目录下,之后重新编译。
  dl目录与feeds目录的区别:dl中存放的是编译过程中需要用到的工具,而feeds中存放的是系统编译好之后在系统中需要用的软件。

3.5、 staging_dir

  用于保存在build_dir目录中编译完成的软件.所以这里也和build_dir有同样的子目录结构.
  比如,在target-XXX文件夹中保存了目标平台编译好的头文件,库文件.在我们开发自己的ipk文件时,编译过程中,预处理头文件,链接动态库,静态库都是到这个子文件夹中.
  staging_dir作为编译的临时安装目录,其中staging_dir/toolchain-*”目录:是编译工具链的最终安装位置。通常我们不需要改动编译链目录下的任何东西,除非要更新编译工具版本等。
  tools、toolchain、build_dir、staging_dir四者的关系
  tools、toolchain目录中的编译中间文件存放在buidl_dir目录下。例如生成的.o 文件等。
  buidl_dir目录存放的软件编译文件,最终安装在staging_dir目录下,因此staging_dir目录为编译安装目录,文件安装到staging_dir目录,并由staging_dir目录的文件生成最终的编译成果。
  所以:流程是:tools、toolchain==>编译到build_dir中==>安装到staging_dir中。

3.6、tmp

  从名字来看,是临时文件夹.在编译过程中,有大量中间临时文件需要保存,都是在这里.

3.7、.logs

  这个文件夹,有时可以看到,有时没有.这是因为这个文件夹保存的是,编译过程中出错的信息,只有当编译出错了才会出现.我们可以从这里获取信息,从而分析我们的软件编译为什么没有完成.

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

OpenWrt源码目录 的相关文章

  • 在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403

    我使用的是 Linux Elementary OS 并在 opt 中安装了 lampp My CSS and JS won t load When I inspect my page through browser The console
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显
  • 内核模式下的线程(和进程)与用户模式下的线程(和进程)有什么区别?

    我的问题 1 书中现代操作系统 它说线程和进程可以处于内核模式或用户模式 但没有明确说明它们之间有什么区别 2 为什么内核态线程和进程的切换比用户态线程和进程的切换花费更多 3 现在 我正在学习Linux 我想知道如何在LINUX系统中分别
  • Gtk-ERROR **:检测到 GTK+ 2.x 符号

    我正在使用 gcc 编译我的 c 应用程序 并使用以下标志 gcc evis c pkg config cflags libs gtk 2 0 libs clutter gtk 1 0 libs gthread 2 0 Wall o evi
  • 是否可以创建一个脚本来保存和恢复权限?

    我正在使用 Linux 系统 需要对一组嵌套文件和目录进行一些权限实验 我想知道是否没有某种方法可以保存文件和目录的权限 而不保存文件本身 换句话说 我想保存权限 编辑一些文件 调整一些权限 然后将权限恢复到目录结构中 将更改的文件保留在适
  • Linux 上的用户空间能否实现本机代码的抢占式多任务处理?

    我想知道是否可以在 Linux 用户空间的单个进程中实现本机代码的抢占式多任务处理 也就是说 从外部暂停一些正在运行的本机代码 保存上下文 交换到不同的上下文 然后恢复执行 所有这些都由用户空间精心安排 但使用可能进入内核的调用 我认为这可
  • 如何减去两个 gettimeofday 实例?

    我想减去两个 gettimeofday 实例 并以毫秒为单位给出答案 这个想法是 static struct timeval tv gettimeofday tv NULL static struct timeval tv2 gettime
  • 快速像素绘图库

    我的应用程序以每像素的方式生成 动画 因此我需要有效地绘制它们 我尝试过不同的策略 库 但结果并不令人满意 尤其是在更高分辨率的情况下 这是我尝试过的 SDL 好的 但是慢 OpenGL 像素操作效率低下 xlib 更好 但仍然太慢 svg
  • Fortran gfortran linux 中的“分段错误(核心转储)”错误

    我正在创建一个程序 该程序将分析目录中的文件 fits 然后它将在另一个目录中创建另一个文件 txt 它只是一个转换器 当我尝试执行该程序 编译正常 时 它给了我一条错误消息 程序收到信号 SIGSEGV 分段错误 无效的内存引用 此错误的
  • NUMA 在虚拟内存中是如何表示的?

    有许多资源 https en wikipedia org wiki Non uniform memory access从硬件角度描述NUMA的架构性能影响 http practical tech com infrastructure num
  • Windows CE 与嵌入式 Linux [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 现在我确信我们都清楚 Linux 与 Windows 桌面的相对优点 然而 我对嵌入式开发世界的了解却少得多 我主要对行业解决方案感兴
  • git 错误:无法处理 https

    当我尝试使用 git clone 时https xxx https xxx我收到以下错误我不处理协议 https 有人可以帮我吗 完整消息 dementrock dementrock A8Se git 克隆https git innosta
  • 在 unix 中编译 dhrystone 时出错

    我是使用基准测试和 makefile 的新手 我已经从下面的链接下载了 Dhrystone 基准测试 我正在尝试编译它 但我遇到了奇怪的错误 我尝试解决它 但没有成功 有人可以帮助我运行 dhrystone 基准测试吗 以下是我尝试编译的两
  • Mcrt1.o和Scrt1.o有什么用?

    我坚持使用以下两个文件 即 Mcrt1 o 和 Scrt1 o 谁能帮我知道这两个文件的用途 如何使用它 我们以 gcrt1 o 为例 在使用 pg 选项编译进行性能测试时非常有用 谢谢 表格的文件 crt o总是 C 运行时启动代码 大部
  • 后台分叉无法正常工作[重复]

    这个问题在这里已经有答案了 我运行这个程序 在前景和背景中 int main int pid printf App Start pid d n getpid while 1 pid fork if pid 0 printf Child n
  • vagrant ssh -c 并在连接关闭后保持后台进程运行

    我正在编写一个脚本来启动和后台流浪机器内的进程 似乎每次脚本结束和 ssh 会话结束时 后台进程也会结束 这是我正在运行的命令 vagrant ssh c cd vagrant src nohup python hello py gt he
  • linux命令中括号的用途是什么[重复]

    这个问题在这里已经有答案了 我在 Linux 终端中运行以下命令 谁能告诉我 Linux 终端中括号和以下命令的用途是什么 echo GET HTTP 1 0 echo 主机 www google com echo 数控 www googl
  • 在 Ubuntu 中找不到 X11/Xlib.h

    我试图在 Linux 上使用 open gl 编写一个相当简单的程序 但在编译时它说 编译拇指 egl 我对 GL 完全陌生 不知道出了什么问题 快速搜索使用 apt search Xlib h 打开 libx11 dev 包 但纯 Ope
  • PyPI 上的轮子平台约束有什么限制吗?

    是否有任何地方 PEP 或其他地方 声明关于 Linux 轮子上传范围的限制 PyPI http pypi io 应该有 具体来说 上传是否被认为是可接受的做法linux x86 64轮子到 PyPI 而不是manylinux1 x86 6

随机推荐

  • Java8中List转Map的实现方法

    在Java编程开发中 经常会遇到将List转换为Map的需求 List是一种有序的集合 而Map则是一种键值对的映射关系 在Java8中 我们可以使用Stream API提供的新特性来实现这一转换 Java8中List转Map的实现方法 在
  • C++编译过程详述

    对于编译过程的总结 源于我的一个突然的好奇 编译头文件和编译头文件对应的源文件有没有区别 因为写makefile的时候依赖即可以写头文件 也可以写源文件 在网上查了半天 估计我的这个问题比较stupid 也没有明确的回答 索性顺藤摸瓜看了看
  • 游戏王大师规则3

    自己一年前翻译的老物了 放在这里算是做个存档 1 OCG Official Card Game 概要 1 1 决斗 游戏王ARC V OCG 以下略称 OCG 是原则上供2人游玩的游戏 而且 按 OCG 规则决出一局胜负称为 决斗 OCG
  • 前端Sass样式预处理器详解

    Sass 是一款强化 CSS 的辅助工具 它在 CSS 语法的基础上增加了变量 variables 嵌套 nested rules 混合 mixins 导入 inline imports 等高级功能 这些拓展令 CSS 更加强大与优雅 通过
  • ch04游戏对象与图形基础

    目录 一 加载Fantasy Skybox FREE 构建自己的游戏场景 二 写一个简单的总结 总结游戏对象的使用 三 魔鬼与牧师 动作分离版 1 解决方案 2 主要更新 3 链接 一 加载Fantasy Skybox FREE 构建自己的
  • JVM代码缓存区CodeCache原理及用法解析

    这篇文章主要介绍了JVM代码缓存区CodeCache原理及用法解析 文中通过示例代码介绍的非常详细 对大家的学习或者工作具有一定的参考学习价值 需要的朋友可以参考下 一 CodeCache简介 从字面意思理解就是代码缓存区 它缓存的是JIT
  • No Dialect mapping for JDBC type :0

    data service 架构 spring Roo hibernate mysql 在调用stored procedure的时候 出现 No Dialect mapping for JDBC type 0 通过反编译java sql Ty
  • kubectl exec 执行 容器命令

    格式如下 kubectl exec it podName c containerName n namespace shell comand 1 创建目录 kubectl exec it spark master xksl c spark m
  • IDEA 常用快捷键

    一 界面操作 进入设置界面 与QQ截图相冲 ctrl alt s 在窗口之间移动 alt 左右箭头 二 光标操作 按字跳转 非常好用 ctrl 左右箭头 选中当前单词 非常好用 ctrl w Idea 多光标操作 alt j alt shi
  • Python安装pip

    文章转载自 https blog csdn net LCCFlccf article details 80095348 python2 7安装目录下没有Scripts文件夹 这种问题可能是你装的python安装包年代久远了 到官网下载最新的
  • 微信小程序打开pdf文件

    前言 使用原生的微信小程序打开pdf文件 注意使用的是文件流的形式 后端接口也需要流的形式来接收 wxml页面
  • window10安装minio

    1 首先第一步我们先下载minio 可以从官网上下不同的版本 下载地址 MinIO Code and downloads to create high performance object storage 2 启动minio 切记不要双击m
  • 众享比特李刘海:国密在超级账本Fabric中的应用

    导读 4月22日 超级账本Hyperledger北京Meetup在北京大学信息学院举行 本次会议由Hyperledger中国工作组和Linux基金会主办 安妮股份 版权区块链联盟 北京大学协办 专注于技术交流 实践分享 案例解析 作为Hyp
  • 六、ResNet网络详细解析(超详细哦)

    1 RestNet网络 1 1 RestNet网络结构 ResNet在2015年被提出 在ImageNet比赛classification任务上获得第一名 因为它 简单与实用 并存 之后很多方法都建立在ResNet50或者ResNet101
  • 《86盒应用于家居中控》——实现智能家居的灵动掌控

    近年来 智能家居产品受到越来越多消费者的关注 其便捷 舒适的生活方式让人们对未来生活充满期待 作为智能家居方案领域的方案商 启明智显生产设计的86盒凭借出色的性能和良好的用户体验 成功应用于家居中控系统 让家庭变得更加智能便捷 一 智能化生
  • 【Flink】flink提交到yarn时 自定义container的提交命令

    文章目录 1 概述 2 yarn 1 概述 在 Flink FLink 是如何与Yarn交互请求Container的 文章中 我们知道了Flink是如何启动ApplicationMaster的 以及如何申请Container的 然后在里面我
  • 如何做好一个BI项目的规划和需求定义?

    正所谓磨刀不误砍柴工 一个项目的启动 先得从金字塔顶端做好规划 摸清楚需求 背景 客观条件 可投入资源等 本文 BI项目详解的第一篇 先来谈谈BI项目的规划和需求定义 全文共3000字 读完需要 8分钟 一 如何启动一个BI项目 Q 一个项
  • 设计模式------适配器模式

    设计模式 适配器模式 文章目录 设计模式 适配器模式 前言 一 两种形式 二 UML图 对象的适配器模式 类的适配器模式 三 实现要点 四 应用场景 五 优点 六 缺点 七 本质 前言 适配器模式 Adapter Pattern 将一个接口
  • C语言实现两个整数相加

    思路 定义两个变量啊 存放要输入的整数 两个整数相加要存放在一个变量sum 此时可以先定义int sum 0 也可以直接int sum a b 这个意思是a b的值存放在sum 类型是int整型 输出sum即可 我犯的错误 是最后一个pri
  • OpenWrt源码目录

    分析的OpenWrt源码目录有助于分析OpenWrt的源码 一 原始目录 1 1 scripts 构建期间用到的各类脚本文件 它存放了一些脚本 使用了bash python perl等多种脚本语言 编译过程中 用于第三方软件包管理的feed