CMake编译学习笔记

news2024/11/25 15:47:29

CMake学习笔记

  • CMake编译概述
    • CMake学习资源
    • CMake编译
      • 项目架构
      • cmake指令
      • CMakeList基础准则
  • CMakeList编写
    • 项目构建
      • cmake_minimum_required() 和 project()
      • set()
      • find_package()
      • add_executable()
      • aux_source_directory()
    • 连接库文件
      • include_directories()和target_include_directories()
      • add_library()
      • add_subdirectory()
      • target_link_libraries()
      • target_link_directories()
    • 安装与日志
      • install target
      • install Files和install programs
      • install Directories
      • message()

CMake编译概述

CMake学习资源

  • CMake官方推荐教程:CMake Tutorial
  • 知乎博客(偏向实践,以项目方式说明):全网最细的CMake教程!(强烈建议收藏)
  • 简书博文(博主对官方文档进行中文说明并配上相关例子):Cmake

对于CMake推荐在项目使用中学习,通过查阅文档和实际测试每个指令的用处能有效的掌握CMake。

CMake编译

项目架构

CMake是一种常用的C++项目编译工具,通常一个完备的CMake项目包括了如下几部分:

  • src:源代码文件夹
  • include:头文件文件夹
  • doc:项目文档文件夹
  • build:编译文件夹
  • devel:ROS1用于保存编译后程序的文件夹
  • run.sh:项目启动脚本(ROS中无)
  • CMakeList.txt:CMake文件,应在项目根目录和各级子文件夹内存在(例如ROS内就是在工作空间根目录和各个功能包根目录下存在)

对于一个C++项目,在编译完成后还可能需要使用make install将其安装至指定位置。

cmake指令

对于一个项目会构建一个build文件夹用于存放编译生成的中间文件,从而避免污染工作空间:

mkdir build & cd build			# 新建build目录并进入
cmake ..						# 构建MakeFile(build父目录)
make -j5						# 编译

cmake ..表示使用cmake构建当前文件夹build的父文件夹(项目根目录)。上述指令还可简化为使用参数--build

mkdir build & cd build			# 新建build目录并进入
cmake --build ..				# 构建并编译(build父目录)

cmake指令的更多参数和使用可参考官方手册:cmake

CMakeList基础准则

CMakeList文件的编写主要遵从如下几条原则:

  • ${变量名}被用于引用CMake变量,使用IF控制语句除外
  • 指令参数被括弧括起,用空格分开:project(projectname [cxx])
  • 指令是大小写无关的(官方推荐小写),参数、变量是大小写相关的
  • 参数中包括空格,则应用双引号括起:"fn nc.c"
  • 使用#注释

CMakeList编写

项目构建

cmake_minimum_required() 和 project()

cmake_minimum_required用于指定所使用CMake的最低版本号,置于CMakeList.txt的开头;project指令则用于指定项目的名称,指令的用法如下:

cmake_minimum_required(VERSION <min>[...<policy_max>] [FATAL_ERROR])
project(<PROJECT-NAME> [<language-name>...])
  • VERSION:关键字,表明后续添加为版本号
    -min: 设置所使用CMake的最低版本号,格式为major.minor[.patch[.tweak]]
    • policy_max:设置所使用的CMake的最高版本号,应高于min
  • <PROJECT-NAME>:设置项目名称
  • <language-name>:设置项目支持的语言,不加表示默认所有编程语言

使用示例如下所示:

cmake_minimum_required(VERSION 3.2.4)
project(Demo)

project指令同时隐式的定义了几个变量:

  • <projectname>_BINARY_DIR:项目编译目录的绝对路径
  • <projectname>_SOURCE_DIR:项目源目录的绝对路径
  • PROJECT_BINARY_DIR:自动绑定<projectname>_BINARY_DIR的内容
  • PROJECT_SOURCE_DIR:自动绑定<projectname>_SOURCE_DIR的内容

通常在调用上述CMake变量时,使用PROJECT_BINARY_DIRPROJECT_SOURCE_DIR进行,从而避免CMake项目名称修改后需要额外修改其余内容。

更多内容可参考官方指导手册:cmake_minimum_required、project
以及博文Cmake命令之cmake_minimum_required介绍和Cmake命令之project介绍

set()

用于设置variable的值为 value,指令用法如下:

set(<variable> <value>... [PARENT_SCOPE])
  • variable:被设置的参数
  • value:设置的值

例如在CMake中指定使用的C++标准为C++ 14,则可定义变量${CMAKE_CXX_STANDARD}的值为14:

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED True)

更多用法(环境变量、缓存变量、定义域等)可查看官方手册:set,以及博文Cmake命令之set介绍

find_package()

用于查找包(通常由项目外部的第三方库提供),并加载其包特定的详细信息。指令使用方式如下:

find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
             [REQUIRED] [[COMPONENTS] [components...]]
             [OPTIONAL_COMPONENTS components...]
             [REGISTRY_VIEW  (64|32|64_32|32_64|HOST|TARGET|BOTH)]
             [GLOBAL]
             [NO_POLICY_SCOPE]
             [BYPASS_PROVIDER])
  • PackageName:需要查找的包名
  • version:可指定查找包的版本要求
    • versionMin...versionMax:如1.1.1.1…1.2.2.1(包括1.2.2.1)
    • versionMin...[<]versionMax:如1.1.1.1…<1.2.2.1(不包括1.2.2.1)
  • QUIET:禁止输出查找日志信息
  • REQUIRED:当未找到满足条件的包时停止构建
  • COMPONENTS:指定要查找的组件

例如如下即为常见的ROS查找catkin包相关组件:

find_package(catkin REQUIRED COMPONENTS
  geometry_msgs
  message_generation
  nav_msgs
  roscpp
  rospy
  std_msgs
  tf
  visualization_msgs
)

更多使用方法可以参考博文Cmake命令之find_package介绍
以及官方手册:find_package

add_executable()

用于从源码文件编译得到一个可执行文件,指令用法如下:

add_executable(<name> [WIN32] [MACOSX_BUNDLE]
               [EXCLUDE_FROM_ALL]
               [source1] [source2 ...])
  • name:编译所得的可执行文件命名
  • source:用于编译的源文件
  • [EXCLUDE_FROM_ALL]:设置后,表明该可执行文件将被排除在all外,需要手动确定才能执行生成

通常仅指定构建的可执行文件名和使用的源码,如:

add_executable(Demo main.c)

更多用法参考博文Cmake命令之add_executable介绍
以及官方手册:add_executable

aux_source_directory()

当一个文件夹内存在多个源代码时,可使用该指令将其定义为一个变量,从而方便调用:

aux_source_directory(<dir> <variable>)
  • dir:源代码路径
  • variable:变量名

例如,下列示例将当前目录下所有源代码加入至DIR_SRCS,并用其编译生成可执行文件Demo

cmake_minimum_required (VERSION 2.8)
project (Demo2)

aux_source_directory(. DIR_SRCS)
add_executable(Demo ${DIR_SRCS})

更多用法可参考官方手册:aux_source_directory

连接库文件

include_directories()和target_include_directories()

两者都用于将给定目录添加到编译器用于搜索包含文件的目录中,不同之处在于include_directories将对整个CMakeList每个目标添加搜索路径,而target_include_directories则仅针对指定目标添加搜索路径,两者用法如下:

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
  <INTERFACE|PUBLIC|PRIVATE> [items1...]
  [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
  • <target>target_include_directories中的指定目标
  • [AFTER|BEFORE]:可显式指定添加头文件搜索路径的位置
    • 在原有搜索路径的最后(AFTER)
    • 在原有搜索路径的最前(BEFORE)
  • dirinclude_directories中添加的搜索路径,相对路径将被解释为基于当前源目录开始
  • <INTERFACE|PUBLIC|PRIVATE>
    • INTERFACE :仅target的头文件可使用该路径
    • PUBLICtarget的头文件和源文件均可以使用
    • PRIVATEtarget对应的源文件可以使用
  • itemstarget_include_directories中添加的搜索路径,相对路径将被解释为基于当前源目录开始

此处可参考博文CMake 添加头文件搜索路径 include_directories, target_include_directories
以及官方手册:include_directories、target_include_directories

add_library()

用于从源码文件编译得到一个库文件,指令用法如下:

add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            [<source>...])
  • <name>:构建的库文件的名称,最终生成的库文件名字将根据本机惯例进行产生,如:lib<name>.lib<name>.a
  • [STATIC | SHARED | MODULE]:构建库文件的类型
    • STATIC:静态库文件
    • SHARED:动态库文件
    • MODULE:模块库文件
  • source:用于编译的源文件
  • [EXCLUDE_FROM_ALL]:设置后,表明该库将被排除在all外,需要手动确定才能执行生成
  • 生成的库文件相关CMake参数以INTERFACE_开头

生成的库文件将被输出至${ARCHIVE_OUTPUT_DIRECTORY}${LIBRARY_OUTPUT_DIRECTORY}${RUNTIME_OUTPUT_DIRECTORY}中:

  • ARCHIVE_OUTPUT_DIRECTORY:静态库文件存储位置
  • LIBRARY_OUTPUT_DIRECTORY:Lib文件存储位置
  • RUNTIME_OUTPUT_DIRECTORY:动态库文件存储位置

若需要导入一个已经生成的库文件还可以使用如下方式:

add_library(<name> [STATIC | SHARED | MODULE] 
			IMPORTED [GLOBAL])
  • IMPORTED关键字用于说明该库文件已生成无需编译
  • GLOBAL:设置后表明该库文件全局可见
  • 使用此方法生成的库文件相关CMake参数以IMPORTED_开头

更多用法可以参考博文:cmake : add_library详解或者官方手册:add_library

add_subdirectory()

用于添加需要被构建的子目录,指令用法如下:

add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL] [SYSTEM])
  • source_dir:指定子目录,其内应包含CMakeList.txt文件、源码文件
  • binary_dir:指定输出可执行文件位置

例如项目内包含子文件夹src,其内包括CMakeList.txt和相关源码。则在项目根目录CMakeList.txt中添加如下指令使其被构建:

add_subdirectory(src)

更多用法可以参考博文Cmake命令之add_subdirectory介绍以及官方手册:add_subdirectory

target_link_libraries()

用于连接可执行文件和对应的库文件:

target_link_libraries(<target> ... <item>... ...)
  • target:被连接的可执行文件
  • item:库文件名称、路径等

例如,可执行文件main连接生成的库文件B

add_executable(main main.c)
add_library(B SHARED b.c)
target_link_libraries(main B)

更多使用方式可参考官方手册:target_link_libraries

target_link_directories()

用于连接可执行文件和用于查找依赖库文件的路径,指令用法如下:

target_link_directories(<target> [BEFORE]
  <INTERFACE|PUBLIC|PRIVATE> [items1...]
  [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

更多使用方式可参考官方手册:target_link_directories

安装与日志

在CMake中安装使用install指令实现,针对不同的文件类型,该指令具备不同的使用方式,可参考官方手册查看详细内容:install

install target

install(TARGETS targets... [EXPORT <export-name>]
        [RUNTIME_DEPENDENCIES args...|RUNTIME_DEPENDENCY_SET <set-name>]
        [[ARCHIVE|LIBRARY|RUNTIME|OBJECTS|FRAMEWORK|BUNDLE|
          PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE|FILE_SET <set-name>|CXX_MODULES_BMI]
         [DESTINATION <dir>]
         [PERMISSIONS permissions...]
         [CONFIGURATIONS [Debug|Release|...]]
         [COMPONENT <component>]
         [NAMELINK_COMPONENT <component>]
         [OPTIONAL] [EXCLUDE_FROM_ALL]
         [NAMELINK_ONLY|NAMELINK_SKIP]
        ] [...]
        [INCLUDES DESTINATION [<dir> ...]]
        )
  • TARGETS:关键字,表明安装的对象为Target
  • targets:指定目标文件名
  • [ARCHIVE|LIBRARY|RUNTIME……]:指定文件类型
    • ARCHIVE:静态库
    • LIBRARY:动态库
    • RUNTIME:可执行目标二进制文件
  • [DESTINATION <dir>]:指定安装路径
    • 若路径<dir>为绝对路径,以"/"开头
    • 若路径<dir>为相对路径,则实际安装路径为:${CMAKE_INSTALL_PREFIX}<dir>
  • [PERMISSIONS permissions...] :用户权限,最高777(参考liunx权限)
    • OWNER_WRITE :拥有者写入权限
    • OWNER_READ :拥有者读取权限
    • OWNER_EXECUTE :组成员执行权限
    • GROUP_WRITE :组成员写入权限
    • GROUP_READ :组成员读取权限
    • GROUP_EXECUTE :组成员执行权限
    • WORLD_WRITE :其他人写入权限
    • WORLD_READ :其他人读取权限
    • WORLD_EXECUTE :其他人执行权限

例如,如下使用方式:

install(TARGETS myExe mySharedLib myStaticLib
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib/static)
install(TARGETS mySharedLib DESTINATION /some/full/path)

上述例子实现如下目标:

  • 二进制文件(RUNTIME)myExe安装至${CMAKE_INSTALL_PREFIX}/bin
  • 动态库文件(LIBRARY)mySharedLib安装至${CMAKE_INSTALL_PREFIX}/lib/some/full/path
  • 静态库文件(ARCHIVE)myStaticLib安装至${CMAKE_INSTALL_PREFIX}/lib/static

install Files和install programs

install(<FILES|PROGRAMS> files...
        TYPE <type> | DESTINATION <dir>
        [PERMISSIONS permissions...]
        [CONFIGURATIONS [Debug|Release|...]]
        [COMPONENT <component>]
        [RENAME <name>] [OPTIONAL] [EXCLUDE_FROM_ALL])
  • <FILES|PROGRAMS>:关键字,表明安装的对象类型为FILESPROGRAMS,应选择其一填写
    • FILES:权限为拥有者读写、组成员读、其余人读(644)
    • PROGRAMS:权限为拥有者读写执行、组成员读执行、其余人读执行(755)
  • files…:指定文件名称
  • TYPE:关键字,表明文件的类型
  • [DESTINATION <dir>]:指定安装路径

文件类型可选如下所示:
在这里插入图片描述

install Directories

install(DIRECTORY dirs...
        TYPE <type> | DESTINATION <dir>
        [FILE_PERMISSIONS permissions...]
        [DIRECTORY_PERMISSIONS permissions...]
        [USE_SOURCE_PERMISSIONS] [OPTIONAL] [MESSAGE_NEVER]
        [CONFIGURATIONS [Debug|Release|...]]
        [COMPONENT <component>] [EXCLUDE_FROM_ALL]
        [FILES_MATCHING]
        [[PATTERN <pattern> | REGEX <regex>]
         [EXCLUDE] [PERMISSIONS permissions...]] [...])
  • [FILE_PERMISSIONS permissions...]:目录内文件权限
  • [DIRECTORY_PERMISSIONS permissions...]:目录本身权限
  • [USE_SOURCE_PERMISSIONS]:若未指定FILE_PERMISSIONS permissions...,则根据源文件权限赋予
  • [PATTERN <pattern>:采用模式匹配进行筛选内容 <pattern>
  • REGEX <regex>:采用正则匹配进行筛选内容<regex>
  • [EXCLUDE]:安装时,排除筛选得到的文件
  • [PERMISSIONS permissions...]:指定筛选得到的文件的权限

例如使用该命令执行如下:

INSTALL(DIRECTORY icons scripts/ 
		DESTINATION share/myproj
		PATTERN "CVS" EXCLUDE
		PATTERN "scripts/*" PERMISSIONS 
		OWNER_EXECUTE OWNER_WRITE OWNER_READ 
		GROUP_EXECUTE GROUP_READ WORLD_EXECUTE
	   )

上述指令执行如下操作:

  • 将目录icons安装至${CMAKE_INSTALL_PREFIX}/share/myproj
  • 将目录scripts/ 中的内容安装${CMAKE_INSTALL_PREFIX}/share/myproj
  • 在进行安装时,排除名字包含CVS 的文件
  • 在进行安装时,将scripts/* 文件的权限指定为731

message()

用于向终端中输出用户定义的编译日志信息,指令用法如下:

message([<mode>] "message text" ...)
  • mode:日志类型
    • FATAL_ERROR:红色CMake Error,将终止CMake编译
    • SEND_ERROR:CMake Error,将跳过生成但不影响编译
    • WARNING:黄色CMake Warning,不影响CMake编译
    • AUTHOR_WARNING:CMake Warning (dev),不影响CMake编译
    • STATUS:输出一些编译过程中的简明信息
    • VERBOSE:输出一些编译过程中的详细信息
  • message text:输出的日志内容

更多使用方式可参考官方手册:message

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/401337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1.4 数值运输商中应注意的几个原则

在数值运算中&#xff0c;每步都可能产生误差&#xff0c;我们不可能(也不必要)步步进行分析&#xff0e;下面仅从误差的某些传播规律和计算机字长有限的特点出发,指出在数值运算中必须注意的几个原则&#xff0c;以提高计算结果的可靠性1. 选用数值稳定性好的算法计算机虽然具…

MySQL Show Profile分析

6 Show Profile分析&#xff08;重点&#xff09; Show Profile是mysql提供可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优的测量 官网文档 默认情况下&#xff0c;参数处于关闭状态&#xff0c;并保存最近15次的运行结果 分析步骤&#xff1a; 1、是否…

Flask+VUE前后端分离的登入注册系统实现

首先Pycharm创建一个Flask项目&#xff1a; Flask连接数据库需要下载的包&#xff1a; pip install -U flask-cors pip install flask-sqlalchemy Flask 连接和操作Mysql数据库 - 王滚滚啊 - 博客园 (cnblogs.com) sqlAlchemy基本使用 - 简书 (jianshu.com) FlaskVue前后端分…

最新研究!美国爱荷华州立大学利用量子计算模拟原子核

爱荷华州立大学物理学和天文学教授James Vary&#xff08;图片来源&#xff1a;网络&#xff09;美国爱荷华州立大学物理学和天文学教授James Vary和来自爱荷华州立大学、马萨诸塞州塔夫茨大学&#xff0c;以及美国能源部加利福尼亚州劳伦斯伯克利国家实验室的研究人员&#xf…

basic1.0链码部署(基于test-network 环境ubuntu20.04腾讯云)

解决了官方示例指令需要科学上网才能运行的问题&#xff08;通过手动下载二进制文件和拉取官方fabric-samples&#xff09;。具体的将bootstrap.sh脚本解读了一遍 具体可以参照我的博客 fabric中bootstrap.sh到底帮助我们干了什么&#xff1f;&#xff08;curl -sSL https://bi…

PACS(CT、CR、DR、MR、DSA、RF医院影像管理系统源码)

PACS具体功能介绍&#xff1a; 病人、采集、观片、三维、报告、照相、退出、文件、图像采集、观片操作、三维、测量标注、诊断报告、照相打印、统计报表、系统管理、帮助、病人浏览器、选择数据源、打开图像、病人登记、工作列表、采集、打开画廊。 DICOM查询/获取&#xff1a…

应用层

应用层 是计算机网络体系的最顶层,是设计和建立计算机网络的最终目的,也是计算机网络中发展的最快的部分 开发一种新的网络应用首先考虑的问题就是网络应用程序在各种端系统上的组织方式和它们之间的关系 客户/服务器方式(C/S方式) 客户是服务请求方,服务器是服务提供方 服务…

【2023-03-10】JS逆向之美团滑块

提示&#xff1a;文章仅供参考&#xff0c;禁止用于非法途径 前言 目标网站:aHR0cHM6Ly9wYXNzcG9ydC5tZWl0dWFuLmNvbS9hY2NvdW50L3VuaXRpdmVsb2dpbg 页面分析 接口流程 1.https://passport.meituan.com/account/unitivelogin主页接口&#xff1a;需获取下面的参数&#xff0…

Intel 处理器 macOS降级到Big Sur

1 创建可引导的 macOS 安装器 将移动硬盘作安装 Mac 操作系统的启动磁盘。 创建可引导安装器需要满足的条件 移动硬盘&#xff08;格式化为 Mac OS 扩展格式&#xff09;&#xff0c;至少有 14GB 可用空间已下载 macOS Big Sur的安装器 2 下载 macOS macOS Big Sur安装器会…

分享一个OJ平台——浙江工商大学的OJ平台

1.引言 最近是有总喜欢讨论算法题&#xff0c;因为他们在准备考研复试&#xff0c;为什么我不准备呢&#xff1f;这是一个悲伤的故事&#xff0c;刚好自己也有面试遇到只能使用C和C的代码题&#xff0c;他们说这OJ平台相对简单一些&#xff0c;那些刷不来LeetCode可以试试这个&…

【数据分析:工具篇】NumPy(1)NumPy介绍

【数据分析&#xff1a;工具篇】NumPy&#xff08;1&#xff09;NumPy介绍NumPy介绍NumPy的特点数组的基本操作创建数组索引和切片数组运算NumPy介绍 NumPy&#xff08;Numerical Python&#xff09;是Python的一个开源的科学计算库&#xff0c;它主要用于处理大规模的多维数组…

linux安装mysql-8.0.31

1)、下载mysql-8.0.31压缩包两种方式 a.本地下载后上传服务器解压&#xff0c;下载地址&#xff1a;https://downloads.mysql.com/archives/community/ b.服务器使用命令下载&#xff0c;注意&#xff1a;路径在那&#xff0c;就下载到那个位置。 wget https://dev.mysql.com/…

解Bug之路-Nginx 502 Bad Gateway

前言 事实证明&#xff0c;读过Linux内核源码确实有很大的好处&#xff0c;尤其在处理问题的时刻。当你看到报错的那一瞬间&#xff0c;就能把现象/原因/以及解决方案一股脑的在脑中闪现。甚至一些边边角角的现象都能很快的反应过来是为何。笔者读过一些Linux TCP协议栈的源码…

宁盾目录成功对接Coremail邮箱,为其提供LDAP统一认证和双因子认证

近日&#xff0c;宁盾与 Coremail 完成兼容适配&#xff0c;在 LDAP 目录用户同步、统一身份认证及双因子认证等模块成功对接。借此机会&#xff0c;双方将加深在产品、解决方案等多个领域的合作&#xff0c;携手共建信创合作生态&#xff0c;打造信创 LDAP 身份目录服务新样本…

第15章 局部波动率的影响

这学期会时不时更新一下伊曼纽尔德曼&#xff08;Emanuel Derman&#xff09; 教授与迈克尔B.米勒&#xff08;Michael B. Miller&#xff09;的《The Volatility Smile》这本书&#xff0c;本意是协助导师课程需要&#xff0c;发在这里有意的朋友们可以学习一下&#xff0c;思…

Java基础-2023.3.08-Java入门

Java入门 1.人机交互 CMD&#xff08;K1-K5&#xff09; 1.CMD&#xff1a; 1&#xff09;在Windows中&#xff0c;利用命令行的方式操作计算机 2&#xff09;可以打开文件&#xff0c;打开文件夹&#xff0c;创建文件夹等 注&#xff1a; 2.打开CMD …

GEE学习01--配置Python与Jupyter Notebook

1、查看自己电脑有哪些Python 首先&#xff0c;使用Arcgis Pro克隆了Python&#xff0c;原先的Pro自带和clone的Python都要确保在系统变量中设置了Path。 这里可以看到有一个WindowsApps&#xff0c;在Path中要将其至于自己的Python下面&#xff0c;否则的话&#xff0c;在Cm…

JavaScript语法

文章目录一、JavaScript是什么&#xff1f;JavaScript引入方式二、基础语法书写语法输出语句变量数据类型运算符流程控制语句数组函数JS变量作用域对象一、JavaScript是什么&#xff1f; JavaScript&#xff1a;是一门跨平台的脚本语言&#xff0c;用来控制网页行为&#xff0…

目标检测 pytorch复现R-CNN目标检测项目

目标检测 pytorch复现R-CNN目标检测项目1、R-CNN目标检测项目基本流程思路2、项目实现1 、数据集下载&#xff1a;2、车辆数据集抽取3、创建分类器数据集3、微调二分类网络模型4、分类器训练5、边界框回归器训练6、效果测试目标检测 R-CNN论文详细讲解1、R-CNN目标检测项目基本…

IO系统—相关数据结构初始化及调用详解(文件描述符表、文件结构表、文件节点表、设备节点表、内核驱动表等)

文章目录数据结构总述数据结构初始化流程概述各结构初始化及关联说明文件描述符表文件结构&#xff08;文件表&#xff09;文件节点设备节点内核驱动表数据结构总述 本文基于NEW_1 型内核数据结构展开&#xff0c;通过上图可以看出了使用三种数据结构&#xff08;文件描述符表项…