Linux下C++开发
Linux下C++开发
Linux 系统介绍
简介
Linux属于多用户多任务操作系统,而Windows属于单用户多任务操作系统Linux一切皆文件- 目录结构
- bin 存储二进制可执行文件
- dev 存放的是外接设备,例如磁盘,光盘等。在其中的外接设备是不能直接被使用的,需要
挂载 - etc 主要存储一些配置文件
- home 表示
除了root用户以外,其它用户的家目录,类似于Windows下的User/用户目录 - proc 全称
process,表示进程,该目录存储的是Linux运行时候的进程 - root 该目录是
root用户自己的家目录 - sbin 全称
super binary,该目录也存储一些可被执行的二进制文件,但必须得有super权限的用户才能执行 - tmp 当系统运行时候产生的
临时文件会存放在这个目录 - usr 存放的是用户自己安装的软件。类似于
Windows下的program files - var 该目录存放
程序/系统的日志文件 - mnt 当外接设备需要挂载的时候,就需要挂载在
mnt目录下
常用命令
time ./hello测试hello程序执行的时间ls -lah /home ./以列表形式显示多个目录,-h表示以可读性较高的形式显示mkdir -p a/b/c表示一次性创建多层不存在的目录mkdir a b c创建多个目录man全称an interface to the system reference manuals- 作用:包含了
Linux中全部命令手册 man man查看man命令的手册man ls查看ls命令的手册
- 作用:包含了
reboot立即重启shutdown -h now立即关机gedit a.txt用可视化文本编辑器打开a.txt
常用快捷键
ctrl+l清屏ctrl+c退出当前行ctrl+w删除当前行一个单词ctrl+shift+'+'放大Terminal【Ubuntu】ctrl+'-'缩小Terminal【Ubuntu】ctrl+'+'放大Terminal【Mingw64】ctrl+'-'缩小Terminal【Mingw64】ctrl+alt+t开启Terminal
安装常用软件
sudo apt update安装软件前,最好更新软件库sudo apt install tree安装可以以树形方式浏览多层目录sudo apt install build-essential gdb安装好gcc,g++,gdb- 查看是否安装成功:
gcc --versiong++ --versiongdb --version
- 查看是否安装成功:
sudo apt install cmake安装cmakesudo apt install libboost-dev安装boost
开发环境搭建
GCC编译器
- 编译过程
- 预处理-Pre-Processing // .i文件
# -E 选项指示编译器仅对输入文件进行预处理 g++ -E test.cpp -o test.i // .i文件 - 编译-Compiling // .s文件
# -S 选项告诉g++在为C++代码产生了汇编语言文件后停止编译 # g++ 产生的汇编语言的默认扩展名为 .s g++ -S test.i -o test.s - 汇编-Assembling // .o文件
# -c 选项告诉g++仅把源代码编译为机器语言的目标代码 # 默认情况下,g++建立的目标文件有一个 .o 的扩展名 g++ -c test.s -o test.o - 链接-Linking // bin文件
# -o 选项指定将来的可执行文件的文件名 g++ test.o -o test
- g++重要的编译参数
- -g 编译带
调试信息的可执行文件# -g 选项告诉GCC产生能被GNU调试器GDB使用的调试信息,以调试程序 g++ -g test.cpp - -O[n] 优化源代码
# -O0 表示不做优化 # -Og 表示不做优化 【有些g++版本不支持】 # -O1 为默认优化 # -O2 除了完成-O1的优化之外,还进行一些额外的调整工作,如指令调整等 # -O3 包括循环展开和其它一些与处理特性相关的优化工作 g++ -O2 test.cpp - -l 和 -L 指定库文件 | 指定库文件路径
# -l参数(小写) 指定程序要链接的库名 # 在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接 g++ -glog test.cpp# 如果库文件没有放在/lib和/usr/lib和/usr/local/lib,需要使用-L参数(大写)指定库文件所在的目录 g++ -L/home/balingshang/mylibfolder -lmylib test.cpp - -I 指定头文件搜索目录
# /usr/include目录一般不需要指定,g++知道去那里找 # 其它目录需要自己指定 g++ -I/myinclude test.cpp - -Wall 打印警告信息s
g++ -Wall test.cpp - -w 关闭警告信息
g++ -w test.cpp - -std=c++11 设置编译标砖
# 使用 c++11 标准编译 test.cpp g++ -std=c++11 test.cpp - -o 指定输出文件名
g++ test.cpp -o test - -D 定义宏
# 在使用gcc/g++编译的时候定义宏# 常用场景: # -DDEBUG定义DEBUG宏,可能文中有DEBUG宏部分的相关信息,用-DDEBUG来选择开启或者关闭DEBUG#include <iostream> int main(int argc, char** argv) { #ifdef DEBUGstd::cout << "In Debug" << std::endl; #elsestd::cout << "Not In Debug" << std::endl; #endif } // 1. 在编译的时候,使用 g++ -DDEBUG main.cpp // 2. 输出:In Debug - man g++ 查看其它编译选项
man g++
- 生成静态链接库
g++ -c mylib.cppar rs libmylib.a mylib.o- 使用:
g++ main.cpp -lmylib -Lmylibfolder -Iinclude -o main
- 生成动态链接库
g++ swap.cpp -Iinclude -fPIC -shared -o libswap.sog++ main.cpp -lswap -Lmysharedlibfolder -Iinclude -o dynamic_main- 使用:
LD_LIBRARY_PATH=mysharedlibfolder ./dynamic_main
GDB调试器
- 常用调试命令参数
开始调试:执行gdb [exefilename],进入gdb调试程序,其中exefilename为要调试的可执行文件名
## 以下命令后括号内为命令的简化使用,比如run(r),直接输入r就代表命令run$(gdb)help(h) # 查看命令帮助,如:help set$(gdb)run(r) # 重新开始运行(run-text:加载文本文件,run-bin:加载二进制文件),如果没有加断点,程序就直接运行结束了$(gdb)start # 单步执行,运行程序,停在第一行执行语句 $(gdb)list(l) # 查看源代码(list-n,从第n行开始查看代码。list+函数名:查看具体函数)$(gdb)set # 设置变量的值$(gdb)next(n) # 单步调试(逐过程,函数直接执行)$(gdb)step(s) # 单步调试(逐语句:跳入自定义函数内部执行)$(gdb)backtrace(bt) # 查看函数调用的栈帧和层级关系$(gdb)frame(f) # 切换函数的栈帧$(gdb)info(i) # 查看函数内部局部变量的数值$(gdb)finish # 结束当前函数,返回到函数调用点$(gdb)continue(c) # 继续运行,相当于F5$(gdb)print(p) # 打印值及地址$(gdb)quit(q) # 退出gdb
$(gdb)break(b)+num # 在第num行设置断点$(gdb)info breakpoints # 查看当前设置的所有断点$(gdb)delete(d) breakpoints num # 删除第num个断点$(gdb)display # 追踪查看具体变量值$(gdb)undisplay # 取消追踪查看变量$(gdb)watch # 被设置观察点的变量发生修改时,打印显示$(gdb)i watch # 显示观察点$(gdb)enable breakpoints # 启用断点$(gdb)disable breakpoints # 禁用断点$(gdb)x # 查看内存 x/20xw 显示20个单元,16进制,每个单元4字节$(gdb)run argv[1] argv[2] # 调试时命令行传参$(gdb)set follow-fork-mode child # Makefile项目管理:选择跟踪父子进程(fork())
Tips:
- 编译时加上
-g,才能用gdb进行调试- 回车键:重复上一命令
- 调试流程
-
方法1
gdb myexeb 13run- 调试会在第13行停住
-
方法2
gdb myexegdb myexe -p pid- continue ©
- set args conf/gs_conf1.xml # 设置参数
- show args # 显示参数
start- 调试会停在第1行
-
方法3
- gdb --args test
- break main
- run
VSCode
- 安装
直接在Ubuntu软件中心下载即可,因为vscode在Ubuntu中是首推软件
- 工程(文件夹)
打开工程(文件夹)
- 控制台进入工程目录,然后输入
code .把当前目录作为工程打开
关闭工程(文件夹)
File->Close Folder
- 界面布局
- 菜单栏
File->Preferences一些偏好设置View->Show Minimap右侧打开预览缩略图View->Editor Layout分屏操作Go->Go to File...打开搜索文件面板Go->Go to Symbol in Workspace...打开在工程搜索符号面板Terminal->New Terminal打开一个命令终端Terminal->Split Terminal把打开的命令终端,再分一个屏出来- 点击
垃圾箱按钮就可以把其中一个终端关闭
- 点击
Help->Welcome打开Welcome界面,在Welcom面板,你可以找到最近打开的工程
- 侧边栏
- Explorer
OPENEDITORS展示当前打开了哪些文件XXX打开的文件夹名字,以大写字母形式展示OUTLINE展示当前打开文件的大纲,比如有哪些类,每个类有哪些成员TIMELINE当你的仓库是用git来管理的时候,可以展示一些修改的记录
- Search
- 在整个文件夹中整体查找
- Source Control
- 用
git进行代码管理 - 可以查看更改,丢弃更改
- 用
- Run and Debug
- Extensions
- 可以搜索插件
INSTALLED已经安装了哪些插件POPULAR有哪些流行的插件RECOMMENDED有哪些推荐的插件给你
- 编辑区
- 编辑代码
- 状态栏
- 光标当前所在行和列
- 空格是多少个字符
UTF8编码LF行尾只有换行符,这是在Linux环境下C++表示你当前的编辑语言是C++Linux表示我们当前的系统是Linux
- 安装插件
C/C++Microsoft出品CMaketwxs出品CMake ToolsMicrosoft出品
- 快捷键
常用快捷键
ctrl+shift+p打开命名面板ctrl+p打开搜索文件面板- 直接输入文件名,跳转到文件
?列出当前可执行的动作!显示Errors或Warnings,也可以ctrl+shift+m:跳转到行数,也可以ctrl+g直接进入@跳转到symbol(搜索变量或者函数),也可以ctrl+shift+o直接进入@:根据分类跳转到symbol,查找变量或者函数,也可以ctrl+shift+o后输入:进入#根据名字查找symbol,也可以ctrl+t
ctrl+t打开在工程搜索符号面板ctrl+反点打开终端ctrl+b关闭/打开 侧边栏ctrl+w关闭当前文件alt+上下箭头当前行上下移动F2变量统一重命名,类似于重构变量命名F12转到定义处
快捷键:编辑器与窗口管理
- 打开一个新窗口:
ctrl+shift+n - 关闭窗口:
ctrl+shift+w - 新建文件:
ctrl+n - 切换出一个新的编辑器(最多
3个):ctrl+\(也可以按住ctrl,然后点击Explorer里的文件名) - 左中右3个编辑器的快捷键:
ctrl+1ctrl+2ctrl+3
快捷键:代码编辑相关
- 代码格式化:
shift+alt+f,或crtl+shift+p后输入format xxx - 向上向下复制一行:
shift+alt+up或shift+alt+down - 列选择:
shift+alt+鼠标选择
快捷键:光标相关
- 定义处缩略图:只看一眼而不跳转过去
alt+f12 - 同时选中所有匹配:
ctrl+shift+l
快捷键:重构代码
- 找到所有的引用:
shift+f12 - 跳转到下一个
Error或Warning:当有多个错误时可按f8逐个跳转
快捷键:查找替换
- 查找:
ctrl+f - 查找替换:
ctrl+h - 整个文件夹中查找:
ctrl+shift+h
快捷键:显示相关
- 全屏:
f11 - ZoomIn/ZommOut:
ctrl +/-
- 调试
launch.json
创建launch.json
- 点击
Run and Debug图标,快捷键是ctrl+shift+d - 点击
creae a launch.json超链接 - 点击
C++(GDB/LLDB) launch.json生成在.vscode目录下
修改launch.json文件
- 修改
program为${workspaceFolder}/build/mycmakeexe - 加入
"preLaunchTask": "Build" - 加入
"miDebuggerPath": "/usr/bin/gdb",如果gdb可以默认找到,就不需要配置
tasks.json
创建tasks.json
- 点击
Terminal - 点击
Configure Default Build Task... - 点击
Create tasks.json file from template - 点击
Others
修改tasks.json
- 删除自动生成的的
tasks.json文件 - 输入如下内容:
{"version": "2.0.0","options": {"cwd": "${workspaceFolder}/build"},"tasks": [{"type": "shell","label": "cmake","command": "cmake","args": [".."]},{"label": "make","group": {"kind": "build","isDefault": true},"command": "make","args": []},{"label": "Build","dependsOrder": "sequence","dependsOn": ["cmake","make"]}] }
- 集成Git
安装Git
sudo apt updatesudo apt install gitgit config --global user.name "xxx"git config --global user.email "xxx@qq.com"git config --list检查是否配置完成
CMake
- 语法特性介绍
- 基本语法格式:指令(参数1 参数2…)
- 参数使用
圆括弧括起 - 参数之间使用
空格或分号分开
- 参数使用
- 指令是大小写无关的,参数和变量是大小写相关的
set(HELLO hello.cpp) add_executable(hello main.cpp hello.cpp) ADD_EXECUTABLE(hello main.cpp ${HELLO}) - **变量使用
${}方式取值,但是在IF控制语句是直接使用变量名
- 重要指令和常用变量
重要指令(大小写无关)
cmake_minimum_required-指定CMake的最小版本要求- 语法:
cmake_minimum_required(VERSION versionNumber [FATAL_ERROR])# CMake最小版本要求为3.0 cmake_minimum_required(VERSION 3.0)
- 语法:
project-定义工程名称,并可指定工程支持的语言- 语法:
project(projectname [CXX] [C] [Java])# 指定工程为`HELLOWORLD` project(HELLOWORLD)
- 语法:
set-显式的定义变量- 语法:
set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])# 定义SRC变量,其值为main.cpp hello.cpp set(SRC main.cpp hello.cpp)
- 语法:
include_directories-向工程添加多个特定的头文件搜索路径- 相当于指定
g++编译器的-I参数 - 语法:
include_directories[[AFTER|BEFORE] [SYSTEM] dir1 dir2...]# 将/usr/include/myincludefolder 和 ./include 添加到头文件搜索路径 include_directories(/usr/include/myincludefolder ./include)
- 相当于指定
link_directories-向工程添加多个特定的库文件搜索路径- 相当于指定g++编译器的
-L参数 - 语法:
link_directories(dir1 dir2...)# 将/usr/lib/mylibfolder 和 ./lib 添加到库文件搜索路径 link_directories(/usr/lib/mylibfolder ./lib)
- 相当于指定g++编译器的
add_library-生成库文件- 语法:
add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)# 通过变量 SRC 生成 libhello.so 共享库 add_library(hello SHARED ${SRC})
- 语法:
add_compile_options-添加编译参数- 语法:add_compile_options(…)
# 添加编译参数 add_compile_options(-Wall -std=c++11 -O2)
- 语法:add_compile_options(…)
add_executable-生成可执行文件- 语法:
add_executable(exename source1 source2...sourceN)# 编译main.cpp生成可执行文件 add_executable(main main.cpp)
- 语法:
target_link_libraries-为target添加需要链接的共享库- 等同于
g++编译器的-l参数 - 语法:
target_link_libraries(target library1<debug|optimized> library2...)
# 将hello动态库链接到可执行文件main target_link_library(main hello)- 等同于
add_subdirectory-向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置- 语法:
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])# 添加src子目录,src中需有一个CMakeLists.txt add_subdirctory(src)
- 语法:
aux_source_directory-发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表- 语法:
aux_source_directory(dir VARIABLE)# 定义SRC变量,其值为当前目录下所有的源代码文件 aux_source_directory(. SRC) # 编译SRC变量所代表的源代码文件,生成main可执行文件 add_executable(main ${SRC})
- 语法:
常用变量
CMAKE_C_FLAGSgcc编译选项CMAKE_CXX_FLAGSg++编译选项# 在CMAKE_CXX_FLAGS编译选项后追加-std=c++11 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")CMAKE_BUILD_TYPE编译类型(Debug,Release)# 设定编译类型为Debug,调试时需要选择Debug set(CMAKE_BUILD_TYPE Debug) # 设定编译类型为Release,发布时需要选择Release set(CMAKE_BUILD_TYPE Release)- 二进制目录
CMAKE_BINARY_DIRPROJECT_BINARY_DIR<projectname>_BINARY_DIR- 这三个变量指代的内容是一致的
- 如果是
in source build,指的就是工程顶层目录 - 如果是
out of source编译,指的是工程编译发生的目录 PROJECT_BINARY_DIR跟其它两个稍有区别,不过现在,你可以理解为他们是一致的
- 源代码目录
CMAKE_SOURCE_DIRPROJECT_SOURCE_DIR<projectname>_SOURCE_DIR- 这三个变量指代的内容是一致的,不论采用何种编译方式都是工程顶层目录
- 也就是在
in source build时,它跟CMAKE_BINARY_DIR等变量一致 PROJECT_SOURCE_DIR跟其它两个稍有区别,不过现在,你可以理解为他们是一致的
- CMAKE_C_COMPILER:指定C编译器
- CMAKE_CXX_COMPILER:指定C++编译器
- EXECUTABLE_OUTPUT_PATH:可执行文件输出的存放路径
- LIBRARY_OUTPUT_PATH:库文件输出的存放路径
- CMake编译工程
CMake目录结构:项目主目录存放一个CMakeLists.txt文件
两种方式设置编译规则:
- 包含源文件的子文件夹包含
CMakeLists.txt文件,主目录的CMakeLists.txt通过add_subdirectory添加子目录即可 - 包含源文件的子文件夹未包含
CMakeLists.txt文件,子目录编译规则体现在主目录的CMakeLists.txt中
编译流程
在Linux平台下使用CMake构建C/C++工程的流程如下:
- 手动编写
CMakeLists.txt - 执行命令
cmake PATH生成Makefile(PATH是顶层CMakeLists.txt所在的目录) - 执行命令
make进行编译
两种构建方式
-
内部构建(in-source build):不推荐使用
内部构建会在同级目录下产生一大堆中间文件,这些中间文件并不是我们最终所需要的,和工程源文件放一起会显得杂乱无章
## 内部构建# 在当前目录下,编译本目录的CMakeLists.txt,生成Makefile和其他文件 cmake . # 执行make命令,生成target make -
外部构建(in-source build):推荐使用
将编译输出文件与源文件放到不同的目录中
## 外部构建# 1. 在当前目录下,创建build文件夹 mkdir build # 2. 进入build文件夹 cd build # 3. 编译上级目录的CMakeLists.txt,生成Makefile和其它文件 cmake .. # 4. 执行make命令
- CMake示例
- 示例一
## 目录结构:include/swap.h src/swap.cpp main.cpp build/# CMakeLists.txt cmake_minimum_required(VERSION 3.0) project(SWAP) include_directories(include) # 或者:include_directories(${CMAKE_SOURCE_DIR}/include) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O2 -Wall") # 或者:set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") # set(CMAKE_BUILD_TYPE Debug) add_executable(main_cmake main.cpp src/swap.cpp)# 执行 cd build cmake .. make ./main_cmake
安装SSH
sudo apt-get install openssh-server- 检查有没有启动:
sudo ps -ef | grep ssh- 如果没有启动:
sudo service ssh start
- 如果没有启动:
- 开机启动ssh:
sudo systemctl enable ssh
xshell连接本地的wsl2
- xshell连接本地的wsl2
延申阅读
- VSCode在Windows下的快捷键
- VSCode在Linux下的快捷键
相关文章:
Linux下C++开发
Linux下C开发 Linux 系统介绍 简介 Linux属于多用户多任务操作系统,而Windows属于单用户多任务操作系统Linux一切皆文件目录结构 bin 存储二进制可执行文件dev 存放的是外接设备,例如磁盘,光盘等。在其中的外接设备是不能直接被使用的&…...
GPT-3.5——从 人工智障 到 大人工智障
有人说,GPT是从人工智障到人工智能的蜕变,但是。。。 我认为,GPT是从 人工智障 到 大人工智障 的退化。。。 从 人工智障 到 大人工智障 GPT-3.5学术介绍No.1---- 西红柿炒钢丝球基本信息详细制作方法材料步骤 幕后花絮 No.2---- 顶尖数学家…...
创建型(四) - 原型模式
一、概念 原型模式(Prototype Pattern):利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间的目的。 使用场景:如果对象的创建成本比较大…...
ABAP 定义复杂的数据结构
最近有个需求是实现ABAP数据类型与JASON类型的转换。想要创建个ABAP的数据类型来接JASON类型是个挺麻烦的事。例如下面这个JASON数据,是个很简单的数据结构。但对ABAP来说有4层了,就有点复杂了。 不过ABAP的数据类型也是支持直接定义数据结构的嵌套的。如…...
HCIP第四节-----------------------------BGP
一、BGP基础 1、BGP得概述 (1)、AS OSPF、IS-IS等IGP路由协议在组织机构网络内部广泛应用,随着网络规模扩大,网络中路由数量不断增长,IGP已无法管理大规模网络,AS的概念由此诞生。 AS指的是在同一个组织…...
Temu闯关日韩受挫?跨境电商卖家如何打磨好营销链路
海外版拼多多 Temu 先后在日本和韩国上线,然而效果不似预期,日韩市场对这套“低价补贴”策略并不买账。作为一个尚未被日韩消费者熟悉的网站,其价格之便宜无法让消费者信任。除此之外更大的问题是,在日本卷不过线下零售与百元店&a…...
console的几个常用用法
console.log() 其一、主要表示:向 Web 控制台输出一条消息; 其二、而具体是什么信息就以传递的实参为准,然后就是在控制台就能显示自己传递参数的结果; console.log([1,3,5,7]) // 输出 [1, 3, 5, 7] console.log({}) // 输出 {} conso…...
服务器数据恢复-HP EVA存储VDISK被删除的数据恢复案例
服务器数据恢复环境: 某单位有一台HP EVA存储,连接2组扩展柜,扩展柜中有12块FATA磁盘和10块FC磁盘,不确定数量的LUN,主机安装WINDOWS SERVER操作系统,存储设备用来存放该单位的重要资料。 服务器故障初检&…...
(搜索) 剑指 Offer 13. 机器人的运动范围 ——【Leetcode每日一题】
❓剑指 Offer 13. 机器人的运动范围 难度:中等 地上有一个 m 行 n 列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外)&…...
Java并发编程之线程池详解
目录 🐳今日良言:不悲伤 不彷徨 有风听风 有雨看雨 🐇一、简介 🐇二、相关代码 🐼1.线程池代码 🐼2.自定义实现线程池 🐇三、ThreadPoolExecutor类 🐳今日良言:不悲伤 不彷徨 有风听风 有…...
开源数据库Mysql_DBA运维实战 (总结)
开源数据库Mysql_DBA运维实战 (总结) SQL语句都包含哪些类型 DDL DCL DML DQL Yum 安装MySQL的配置文件 配置文件:/etc/my.cnf日志目录:/var/log/mysqld.log错误日志:/var/log/mysql/error.log MySQL的主从切换 查看主…...
图神经网络与分子表征:1. 分子图和图神经网络基础
CSDN的朋友们大家好,好久没写系列文章了。 近期读了很多图神经网络(GNN)和分子表征(molecular representation)的论文,正好最近不是很忙,所以我决定把自己的学习过程记录下来,与大家…...
Spring Boot与Redisson的整合。分布式锁
Spring Boot与Redisson的整合可以帮助您在Spring Boot应用程序中使用分布式锁、缓存等功能。下面是一些基本步骤来整合Spring Boot与Redisson: 添加Maven/Gradle依赖: 在您的Spring Boot项目的pom.xml(Maven)或build.gradle&#…...
Lua中逻辑运算符and,or,not 区别与用法
在Lua中,逻辑运算符包括 and、or 和 not。它们用于对布尔值进行逻辑运算。 and运算符: 当同时满足两个表达式时,返回第二个表达式的值;否则,返回第一个表达式的值。如果第一个表 达式的值为false或nil,则…...
使用 spaCy 增强 NLP 管道
介绍 spaCy 是一个用于自然语言处理 (NLP) 的 Python 库。SpaCy 的 NLP 管道是免费且开源的。开发人员使用它来创建信息提取和自然语言理解系统,例如 Cython。使用该工具进行生产,拥有简洁且用户友好的 API。 如果您处理大量文本,您会想了解更多相关信息。例如,它是关于什…...
【HCIP】08.ISIS中间系统
链路状态协议,传递LSA信息ISIS基于数据链路层封装在OSI时,也有自己的网络层地址和自己的路由协议,即ISIS。之前的ISIS支持OSI的网络层地址,是为OSI中的CLNP(无连接网络协议)网络设计的路由协议,…...
Android 13 Framework 添加自定义的系统服务CustomService
目的: 添加自定义的系统服务,在自定义的服务中开发定制的API接口和功能,独立于系统核心服务,方便开发和维护。 开发环境:Android 13 MTK平台 涉及修改的文件如下 device/mediatek/sepolicy/base/private/service_contexts device/mediatek/sepolicy/base/vendor/platfo…...
前端食堂技术周刊第 95 期:Fresh 1.4、Rollup 迁移至 SWC计划、RSC Devtools、使用开源库的边界、AI 帮你讲论文
美味值:🌟🌟🌟🌟🌟 口味:冰葡美式 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 大家好,我是童欧巴。欢迎来到前端食堂技术周刊,我们先来看下…...
【TypeScript】枚举类型
在 TypeScript 中,枚举(Enum)是一种用于定义命名常量集合的数据类型。枚举使代码更加可读和可维护,因为它们为一组具有语义的值提供了命名。 以下是 TypeScript 中枚举的基本用法和特点: // 声明一个枚举 enum Direc…...
快速通过华为HCIP认证
你可以按照以下步骤进行准备和学习: 华为认证课程和资料--提取码:1234https://pan.baidu.com/s/1YJhD8QbocHhZ30MvrKm8hg 了解认证要求:查看华为官方网站上的HCIP认证要求和考试大纲,了解考试的内容、考试形式和考试要求。 学习相关知识&am…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
ZYNQ学习记录FPGA(二)Verilog语言
一、Verilog简介 1.1 HDL(Hardware Description language) 在解释HDL之前,先来了解一下数字系统设计的流程:逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端,在这个过程中就需要用到HDL,正文…...
