当前位置: 首页 > news >正文

C++ 常用命令行开发工具(Linux)

文章目录

  • 1、简介
  • 2、gcc / g++
    • 2.1 system(执行shell 命令)
    • 2.2 popen(建立管道I/O)
    • 2.3 vfork+exec(新建子进程)
  • 3、clang
    • 3.1 下载和安装clang
    • 3.2 clang和gcc比较
      • 3.2.1 gcc
      • 3.2.2 clang
      • 3.2.3 LLVM
  • 4、make
    • 4.1 例子1
    • 4.2 例子2
    • 4.3 问题汇总
  • 5、cmake
    • 5.1 下载cmake
    • 5.2 安装cmake
  • 6、gdb
  • 7、git
    • 7.1 下载和安装git
    • 7.2 使用git
  • 8、bash
    • 8.1 Centos bash: 运行 ./xxx.sh: 权限不够
    • 8.2 Linux中解决cannot access ‘\r’: No such file or directory
    • 8.3 readelf查看可执行文件信息
    • 8.4 常见Shell的种类
  • 结语

1、简介

编译的四个阶段:预处理(扩展各个宏与文件)、编译(得到汇编代码)、汇编(得到机器码)、链接(得到可执行文件)
在这里插入图片描述

预处理:编译处理宏定义等宏命令(eg:#define)——生成后缀为“.i”的文件   
编译:将预处理后的文件转换成汇编语言——生成后缀为“.s”的文件   
汇编:由汇编生成的文件翻译为二进制目标文件——生成后缀为“.o”的文件   
连接:多个目标文件(二进制)结合库函数等综合成的能直接独立执行的执行文件——生成后缀为“.out”的文件

在这里插入图片描述
在这里插入图片描述

2、gcc / g++

The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Ada, Go, and D, as well as libraries for these languages (libstdc++,…). GCC was originally written as the compiler for the GNU operating system. The GNU system was developed to be 100% free software, free in the sense that it respects the user’s freedom.

在这里插入图片描述

实际使用中我们更习惯使用 gcc 指令编译 C 语言程序,用 g++ 指令编译 C++ 代码。需要强调的一点是,这并不是 gcc 和 g++ 的区别,gcc 指令也可以用来编译 C++ 程序,同样 g++ 指令也可以用于编译 C 语言程序。

GCC 编译器已经为我们提供了调用它的接口,对于 C 语言或者 C++ 程序,可以通过执行 gcc 或者 g++ 指令来调用 GCC 编译器。

当然,gcc 指令也为用户提供了“手动指定代表编译方式”的接口,即使用 -x 选项。例如,gcc -xc xxx 表示以编译 C 语言代码的方式编译 xxx 文件;而 gcc -xc++ xxx 则表示以编译 C++ 代码的方式编译 xxx 文件。

但如果使用 g++ 指令,则无论目标文件的后缀名是什么,该指令都一律按照编译 C++ 代码的方式编译该文件。也就是说,对于 .c 文件来说,gcc 指令以 C 语言代码对待,而 g++ 指令会以 C++ 代码对待。但对于 .cpp 文件来说,gcc 和 g++ 都会以 C++ 代码的方式编译。

gcc -v
g++ -v

在这里插入图片描述

# gcc 编译c代码
gcc demo.c
gcc main.c func.c -o app.out# gcc 编译c++代码
gcc -xc++ -lstdc++ -shared-libgcc demo.cpp 
gcc -xc++ -lstdc++ -shared-libgcc demo.cpp -o democpp.exe# g++ 编译c++代码
g++ demo.cpp
g++ demo.cpp -o democpp.exe

首先说明:gcc 和 GCC 是两个不同的东西

GCC:GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。
gcc是GCC中的GUN C Compiler(C 编译器)
g++是GCC中的GUN C++ Compiler(C++编译器)

在这里插入图片描述
gcc 命令的常用选项:

选项解释
-ansi只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色, 例如 asm 或 typeof 关键词。
-c只编译并生成目标文件。
-DMACRO以字符串"1"定义 MACRO 宏。
-DMACRO=DEFN以字符串"DEFN"定义 MACRO 宏。
-E只运行 C 预编译器。
-g生成调试信息。GNU 调试器可利用该信息。
-IDIRECTORY指定额外的头文件搜索路径DIRECTORY。
-LDIRECTORY指定额外的函数库搜索路径DIRECTORY。
-lLIBRARY连接时搜索指定的函数库LIBRARY。
-m486针对 486 进行代码优化。
-o FILE生成指定的输出文件。用在生成可执行文件时。
-O0不进行优化处理。
-O 或 -O1优化生成代码。
-O2进一步优化。
-O3比 -O2 更进一步优化,包括 inline 函数。
-shared生成共享目标文件。通常用在建立共享库时。
-static禁止使用共享连接。
-UMACRO取消对 MACRO 宏的定义。
-w不生成任何警告信息。
-Wall生成所有警告信息。

2.1 system(执行shell 命令)

头文件:
#include<stdlib.h>
定义函数:
int system(const char * string);
函数说明:
system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。

test_sys.c:

#include<stdlib.h>
#include<stdio.h>int 
main(int argc, char *argv[])
{system("ls -al /etc/docker /etc/nginx /etc/firefox");return 0;
}
gcc test_sys.c -o test.exe
./test.exe

在这里插入图片描述

2.2 popen(建立管道I/O)

头文件
#include<stdio.h>
定义函数
FILE * popen( const char * command,const char * type);
函数说明
popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c 来执行参数command的指令。参数type可使用“r”代表读取,“w”代表写入。依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。

test_popen.c:

#include<stdio.h>main()
{FILE* fp;char buffer[80];fp=popen("cat /etc/nginx", "r");fgets(buffer,sizeof(buffer),fp);printf("%s", buffer);pclose(fp);
}
gcc test_popen.c -o test.out
./test.out

在这里插入图片描述

2.3 vfork+exec(新建子进程)

使用vfork()新建子进程,然后调用exec函数族。
test_vfork.c:

#include<unistd.h>
#include<stdio.h>main()
{char * argv[]={"ls", "-al", "/etc/firefox", (char*)0 };if(vfork() == 0){execv("/bin/ls", argv);}else{        printf("it is the parent process\n");}
}
gcc test_vfork.c -o test.out
./test.out

在这里插入图片描述

3、clang

The Clang project provides a language front-end and tooling infrastructure for languages in the C language family (C, C++, Objective C/C++, OpenCL, CUDA, and RenderScript) for the LLVM project. Both a GCC-compatible compiler driver (clang) and an MSVC-compatible compiler driver (clang-cl.exe) are provided. You can get and build the source today.
https://clang.llvm.org/

Clang是一个C语言、C++、Objective-C语言的轻量级编译器。源代码发布于BSD协议下。Clang将支持其普通lambda表达式、返回类型的简化处理以及更好的处理constexpr关键字。
在这里插入图片描述

Clang是一个C++编写、基于LLVM、发布于LLVM BSD许可证下的C/C++/Objective-C/Objective-C++编译器。它与GNU C语言规范几乎完全兼容(当然,也有部分不兼容的内容,包括编译命令选项也会有点差异),并在此基础上增加了额外的语法特性,比如C函数重载(通过__attribute__((overloadable))来修饰函数),其目标(之一)就是超越GCC。
在这里插入图片描述
win10 的 msvc,Ubuntu 的 gcc 和 clang
gcc 是c的编译器,g++是c++的编译器。

3.1 下载和安装clang

# yum install epel-release
yum install clang

在这里插入图片描述
在这里插入图片描述

检查是否安装成功(查看clang版本,有显示即为成功):

clang --version
clang -v

在这里插入图片描述

3.2 clang和gcc比较

3.2.1 gcc

GCC(GNU Compiler Collection,GNU编译器套装),是一套由GNU开发的编程语言编译器。它是一套以GPL及LGPL许可证所发布的自由软件,也是GNU项目的关键部分,亦是自由的类Unix及苹果电脑Mac OS X 操作系统的标准编译器。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。

GCC原名为GNU C语言编译器(GNU C Compiler),因为它原本只能处理C语言。GCC很快地扩展,变得可处理C++。之后也变得可处理Fortran、Pascal、Objective-C、Java、Ada,以及Go与其他语言。

原本用C开发,后来因为LLVM、Clang的崛起,令GCC更快将开发语言转换为C++。许多C的爱好者在对C++一知半解的情况下主观认定C++的性能一定会输给C,但是Taylor给出了不同的意见,并表明C++不但性能不输给C,而且能设计出更好,更容易维护的程序。

3.2.2 clang

Clang(发音为/ˈklæŋ/类似英文单字clang) 是一个C、C++、Objective-C和Objective-C++编程语言的编译器前端。它采用了底层虚拟机(LLVM)作为其后端。它的目标是提供一个GNU编译器套装(GCC)的替代品。作者是克里斯·拉特纳,在苹果公司的赞助支持下进行开发,而源代码授权是使用类BSD的伊利诺伊大学厄巴纳-香槟分校开源码许可。

Clang项目包括Clang前端和Clang静态分析器等。

3.2.3 LLVM

“ LLVM , 它是一个 编译器 的基础建设,以 C++ 写成。它是为了任意一种编程语言写成的程序,利用 虚拟技术 ,创造出 编译时期 , 链结时期 , 运行时期 以及“闲置时期”的优化。

因为GCC的编译器已经慢慢无法满足苹果的需求,因此,苹果开发了Clang与LLVM来完全取代GCC,Xcode4之后,苹果的默认编译器已经是LLVM了。Clang作为编译器前端,LLVM作为编译器后端。

4、make

无论是在linux 还是在Unix环境 中,make都是一个非常重要的编译命令。

Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。

make --version
make -v

在这里插入图片描述
–f :指定作为makefile的文件的名称。 如果不用该选项,那么make程序首先在当前目录查找名为makefile的文件,如果没有找到,它就会转而查找名为Makefile的文件。如果您在Linux下使用GNU Make的话,它会首先查找GNUmakefile,之后再搜索makefile和Makefile。按照惯例,许多Linux程序员使用Makefile,因为这样能使Makefile出现在目录中所有以小写字母命名的文件的前面。

4.1 例子1

  • Makefile文件内容如下:
all:gcc -Wall test.c -o test.out

执行命令如下:

make
# or
make all

在这里插入图片描述

  • Makefile文件内容如下:
all:gcc -c -Wall test.c gcc -Wall test.o -o test.out

执行命令如下:

make

在这里插入图片描述

  • Makefile文件内容如下:
all:gcc -c -Wall test.c gcc -c -Wall anotherTest.c gcc -Wall test.o anotherTest.o -o test.out

执行命令如下:

make

在这里插入图片描述

4.2 例子2

  • Makefile文件内容如下:
all: test test: test.o anotherTest.o gcc -Wall test.o anotherTest.o -o test.outtest.o: test.c gcc -c -Wall test.c anotherTest.o: anotherTest.c gcc -c -Wall anotherTest.c clean: rm -rf *.o test.out

执行命令如下:

make all
make test
make clean

在这里插入图片描述
通过 -B 选项让所有目标总是重新建立:

make -B

在这里插入图片描述
使用 -d 选项打印调试信息:

make -d | more

在这里插入图片描述
使用 -C 选项改变目录:
你可以为 make 命令提供不同的目录路径,在寻找 Makefile 之前会切换目录的。
但是你想运行的 make 命令的 Makefile 文件保存在 …/make-dir/ 目录下,你可以这样做:

make -C ../make-dir/

通过 -f 选项将其它文件看作 Makefile:

make -f my_makefile

4.3 问题汇总

可能出现的问题如下:
“Makefile:1: *** 遗漏分隔符 。 停止。”?

5、cmake

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。
在这里插入图片描述

5.1 下载cmake

在这里插入图片描述
ubuntu系统下只需要如下一句命令即可:

# ubuntu
sudo apt install cmake

CMake 提供了多种版本,包括但不限于 “RC 版本”(Release Candidate)和“稳定版本”(Latest Release)。切换到系统存放源代码的目录,再用 curl 命令通过该链接将 CMake 的二进制分发压缩包下载下来:

cd /usr/local/srccurl -LO https://github.com/Kitware/CMake/releases/download/v3.22.2/cmake-3.22.2-linux-x86_64.tar.gz# or
yum install -y wget
wget -c https://github.com/Kitware/CMake/releases/download/v3.22.2/cmake-3.22.2-linux-x86_64.tar.gz
# wget -c https://cmake.org/files/v3.26/cmake-3.26.0-rc1-linux-x86_64.tar.gz

在这里插入图片描述

5.2 安装cmake

CMake 二进制分发压缩包下载完毕后,运行以下两条命令将压缩包解压缩,并将得到的文件夹移动到系统的本地程序目录,同时将文件夹重命名为 cmake(即 /usr/local/cmake):

tar -xvf cmake-3.26.0-rc1-linux-x86_64.tar.gz
# tar zxvf cmake-3.22.2-linux-x86_64.tar.gz
mv cmake-3.26.0-rc1-linux-x86_64 /usr/local/cmake

在这里插入图片描述
在这里插入图片描述
查看安装后的路径:

ls /usr/local/cmake

在这里插入图片描述

如果你是第一次按照本文步骤安装 CMake,为方便之后运行 CMake 的相关命令,请运行以下两条命令将 CMake 的可执行文件目录添加到系统环境变量 PATH 中:

echo 'export PATH="/usr/local/cmake/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

在这里插入图片描述
查看~/.bashrc:

vi ~/.bashrc
#在最后添加export PATH=/usr/local/cmake/bin:$PATH

在这里插入图片描述

查看cmake的版本:

cmake --verison

在这里插入图片描述

6、gdb

GDB是一个强大的命令行调试工具。虽然X Window提供了GDB的图形版DDD,但是我仍然更钟爱在命令行模式下使用GDB。

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。
一般来说,GDB主要帮忙你完成下面四个方面的功能:

1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
gdb

在这里插入图片描述
一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:

gcc -g hello.c -o hello
g++ -g hello.cpp -o hello

如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。

# 在进入函数func时,设置一个断点。可以敲入break func,或是直接就是b func
gdb
b main

在这里插入图片描述

7、git

Git — The stupid content tracker, 傻瓜内容跟踪器。Linus Torvalds 是这样给我们介绍 Git 的。
在这里插入图片描述
Git 是用于 Linux内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持(wingeddevil注:这得分是用什么样的服务端,使用http协议或者git协议等不太一样。
在这里插入图片描述

并且在push和pull的时候和服务器端还是有交互的。),使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要。 Git 最为出色的是它的合并跟踪(merge tracing)能力。

在这里插入图片描述

7.1 下载和安装git

Git是目前流行的非常好用的版本控制工具,这里介绍两种安装方式,1、yum安装,2、从github上下载最新的源码编译后安装。

在Linux上是有yum安装Git,非常简单,只需要一行命令:

yum -y install git

在这里插入图片描述

输入 git --version查看Git是否安装完成以及查看其版本号:

git --version

在这里插入图片描述
当然我们也可以从GitHub上下载最新的源码编译后安装。

# 需要删除旧的Git
yum -y remove git
# 下载,https://github.com/git/git/releases
wget https://github.com/git/git/archive/refs/tags/v2.39.1.tar.gz
# 进入/usr/local 目录解压git文件
tar -zxvf v2.39.1.tar.gz
# 安装编译所需要的依赖。
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
# 编译git源码,进入cd /usr/local/git-2.39.1 目录
make prefix=/usr/local/git all
# 安装git至/usr/bin/git路径
make prefix=/usr/local/git install
# 配置环境变量
vi /etc/profile 
# 在底部加上如下
export PATH=$PATH:/usr/bin/git/bin
# 刷新环境变量
source /etc/profile
# 查看Git是否安装完成
git --version

在这里插入图片描述
在这里插入图片描述

7.2 使用git

命令功能
git init在本地的当前目录里初始化git仓库
git status查看当前仓库的状态
git add -A增加目录中所有的文件到缓存区
git add file增加相应文件到缓存区
git commit -m “信息”将缓存区中更改提交到本地仓库
git log查看当前版本之前的提交记录
git reflog查看HEAD的变更记录,包括回退
git branch -b branch_name建立一个新的分支
git diff查看当前文件与缓存区文件的差异
git checkout – file取消更改,将缓存区的文件提取覆盖当前文件
git reset --hard 版本号回退到相应版本号,同样也可以回退到未来的版本号
git clean -xf删除当前目录中所有未追踪的文件
git config --global core.quotepath false处理中文文件名

常用命令如下:

git remote add origin git@github.com:<用户名>/<仓库名>.git
git pull origin master //因为github建立仓库时会有readme.md文件,先要拷贝一份
git push -u origin master //将本地仓库链接到master分支上,你当然可以链接到其他分支
git push //上传你的本地仓库

8、bash

Bash Shell脚本是用Bash编写的计算机程序,它是一个包含了自定义数量命令的纯文本文件,用于在Linux系统上自动循环执行重复性任务。

8.1 Centos bash: 运行 ./xxx.sh: 权限不够

编写脚本xxx.sh:

#! /bin/bash
echo 'hello world';

在这里插入图片描述
在这里插入图片描述

chmod 777 ./xxx.sh
# chmod u+x test.sh
./xxx.sh

或者

chmod +x ./xxx.sh

或者

# 该方式不需要在第一行指定解释器信息
/bin/sh xxx.sh
# or 
sh xxx.sh
sh /root/test.sh

8.2 Linux中解决cannot access ‘\r’: No such file or directory

碰到这种情况,是因为脚本文件在windows环境下编辑过后再上传到linux服务器导致换行符格式不对。使用dos2unix命令行即可解决。
Ubuntu系统打开Windows下生成的文本文件,会在每行的末尾出现’^M’
原因就是Windows和Linux的回车符是不同的。

 在Windows下回车符是\r\n回车换行在Linux下回车符是\n

最简单、最常用的解决方法是使用dos2unix命令转换:

## ubuntu
apt-get install dos2unix
# or
apt-get install tofrodos## centos
#进入root用户后,使用
yum install dos2unix。

在这里插入图片描述
dos2unix命令 用来将DOS格式的文本文件转换成UNIX格式的(DOS/MAC to UNIX text file format converter)。DOS下的文本文件是以\r\n作为断行标志的,表示成十六进制就是0D 0A。而Unix下的文本文件是以\n作为断行标志的,表示成十六进制就是0A。DOS格式的文本文件在Linux底下,用较低版本的vi打开时行尾会显示^M,而且很多命令都无法很好的处理这种格式的文件,如果是个shell脚本,。而Unix格式的文本文件在Windows下用Notepad打开时会拼在一起显示。因此产生了两种格式文件相互转换的需求,对应的将UNIX格式文本文件转成成DOS格式的是unix2dos命令。

dos2unix [-hkqV] [-c convmode] [-o file ...] [-n infile outfile ...]-k:保持输出文件的日期不变
-q:安静模式,不提示任何警告信息。
-V:查看版本
-c:转换模式,模式有:ASCII, 7bit, ISO, Mac, 默认是:ASCII。
-o:写入到源文件
-n:写入到新文件
# 最简单的用法就是dos2unix直接跟上文件名
dos2unix file
# 如果一次转换多个文件
dos2unix file1 file2 file3
dos2unix -o file1 file2 file3
# 如果想把转换的结果保存在别的文件
dos2unix -n oldfile newfile
# 如果要保持文件时间戳不变
dos2unix -k file
dos2unix -k file1 file2 file3
dos2unix -k -o file1 file2 file3
dos2unix -k -n oldfile newfile
# 转换当前目录下所有文件
find -type f | xargs dos2unix

也可以使用*通配符来同时修改多个,或者使用空格隔开文件名的方式。

8.3 readelf查看可执行文件信息

readelf命令,一般用于查看ELF格式的文件信息,常见的文件如在Linux上的可执行文件,动态库(.so)或者静态库(.a) 等包含ELF格式的文件。以下命令的使用是基于android编译出来的so文件上面去运行。

  • 选项 -h(elf header),显示elf文件开始的文件头信息。
readelf -h ./test007.out

在这里插入图片描述

  • 选项 -l(program headers),segments 显示程序头(段头)信息(如果有数据的话)。
readelf -l ./test007.out

在这里插入图片描述

  • 选项 -S(section headers),sections 显示节头信息(如果有数据的话)。
readelf -S ./test007.out

在这里插入图片描述

  • 选项 -s,symbols 显示符号表段中的项
readelf -s ./test007.out

在这里插入图片描述

  • 选项 -r,relocs 显示可重定位段的信息。
readelf -r ./test007.out
  • 选项 -d,dynamic 显示动态段的信息。
readelf -d ./test007.out
  • 选项 -A,arch-specific 显示CPU构架信息。
readelf -A ./test007.out
  • 选项 -a,all 显示全部信息,等价于 -h -l -S -s -r -d -V -A -I。
readelf -a ./test007.out
  • 选项 -H,help 显示readelf所支持的命令行选项。
readelf -H ./test007.out
  • 选项 -V,version-info 显示版本段的信息。
readelf -V ./test007.out

在这里插入图片描述

8.4 常见Shell的种类

Linux Shell的种类很多,用户可以通过查看/etc/shells文件中的内容来查看自己主机中当前有哪些种类的Shell。

cat /etc/shells

在这里插入图片描述
Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言。

shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。

shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中的其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。

Linux中的shell有多种类型,常见的有Bourne Again Shell (简称bash)、Bourne Shell(简称sh)、C-Shelll(简称csh)、Korn Shell(简称ksh)。

sh是Unix最初使用的shell,并且在每种Unix上都可以使用。sh在shell编程方面相当优秀,但在处理与用户的交互方面做得不如csh和ksh。Linux默认的shell是bourne again shell(bash),它与sh完全向后兼容。bash放在bin/bash中。sh和bash都是Linux上的默认shell,而bash是sh的升级版。

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

相关文章:

C++ 常用命令行开发工具(Linux)

文章目录1、简介2、gcc / g2.1 system&#xff08;执行shell 命令&#xff09;2.2 popen&#xff08;建立管道I/O&#xff09;2.3 vforkexec&#xff08;新建子进程&#xff09;3、clang3.1 下载和安装clang3.2 clang和gcc比较3.2.1 gcc3.2.2 clang3.2.3 LLVM4、make4.1 例子14…...

java基础学习 day47(抽象类,抽象方法)

1. 抽象方法 将共性的行为&#xff08;方法&#xff09;抽取到父类之后&#xff0c;由于每一个子类执行的内容是不一样的&#xff0c;所以&#xff0c;在父类中不能确定具体的方法体&#xff0c;该方法就可以定义为抽象方法。抽象方法定义格式&#xff1a; public abstract 返…...

Java代码弱点与修复之——Open redirect(开放重定向)

弱点描述 Open redirect , 开放重定向,是一种常见的安全漏洞,也被称为“重定向漏洞”。该漏洞通常出现在 Web 应用程序中,攻击者可以利用它将用户重定向到恶意站点,从而进行钓鱼攻击、恶意软件传播、诱骗等活动。 在 Java 中,通过重定向 HTTP 请求来实现应用程序中的跳转…...

Go 指针

指针在编程中&#xff0c;一个内存地址用来定位一段内存。通常地&#xff0c;一个内存地址用一个操作系统原生字&#xff08;native word&#xff09;来存储。 一个原生字在32位操作系统上占4个字节&#xff0c;在64位操作系统上占8个字节。 所以&#xff0c;32位操作系统上的理…...

shardingsphere5.1.1分表分库yaml配置 自定义策略

前言通过阅读官方稳定给出示例 https://shardingsphere.apache.org/document一、基本配置示例spring:sharding:datasource:names: ds0, ds1ds0:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/db0username: rootpassword: rootds1:driver-class-na…...

“探索未来:VR全景直播技术引领新媒体时代”

随着虚拟现实技术的不断发展&#xff0c;VR全景直播已经成为了越来越受欢迎的直播形式。VR全景直播可以让观众通过虚拟现实设备亲临直播现场&#xff0c;享受身临其境的观看体验。VR全景直播是什么&#xff1f; VR全景直播是虚拟现实技术和直播的结合。相对于传统直播&#xff…...

Spring Cloud(微服务)学习篇(六)

Spring Cloud(微服务)学习篇(六) 2 Sentinel实现流量规则(控制台版) 2.1 变更pom.xml(shop-user-server项目)代码 2.1.1 加入如下依赖 <!--熔断限流--> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-…...

MATLAB-Scatter3-三维散点图投影至XYZ三个平面

MATLAB-Scatter3函数可以绘制立体的三维散点图&#xff0c;但有时候需要在该立体图中分析X-Y-Z三者的关系&#xff0c;即1副图呈现出4个信息&#xff0c;XYZ综合信息、XY信息、XZ信息、YZ信息。现有的Scatter3无法实现该功能&#xff0c;本文可实现Scatter3三维立体散点图在三个…...

Unity/C#------委托与事件(一篇文章彻底搞懂...)

一&#xff1a;委托 所有的代码语言创造者母语都是英语&#xff0c;我们从英语翻译到中文的过程中难免会存在一些不太能还原本意的词&#xff0c;比如我之前一直不理解构造函数和析构函数&#xff0c;只知道这俩货作用相反&#xff0c;直到我看到了它的英文意思&#xff0c;Con…...

别再为 Jenkins 安装烦恼,Docker 帮你轻松解决

前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本文收录与云原生相关的专栏&#xff0c;以下是我的简介&#xff1a; &#x1f3e0;个人主页&#xff1a;我是沐风晓月 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是沐风晓月&#xff0c;双…...

汇编语言程序设计(一)

前言 在学习汇编语言之前&#xff0c;我们应该要知道汇编语言他是一门怎么样的语言。汇编语言是直接工作在硬件上的一门编程语言&#xff0c;学习汇编语言之前最好先了解一下计算机硬件系统的结构和工作原理。学习汇编语言的重点是学习如何利用硬件系统的编程结构和指令集进而…...

【uni-app教程】四、UniAPP 路由配置及页面跳转

四、UniAPP 路由配置及页面跳转 (1) 路由配置 uni-app页面路由为框架统一管理&#xff0c;开发者需要在pages.json里配置每个路由页面的路径及页面样式。类似小程序在 app.json 中配置页面路由一样。所以 uni-app 的路由用法与 Vue Router 不同&#xff0c;如仍希望采用 Vue …...

ROS从入门到精通系列(二十八)-- ROS控制器图形化界面开发

ROS (Robot Operating System, 机器人操作系统) 作为机器人软件中的通信及控制中间件,提供一系列程序库和工具以帮助软件开发者创建机器人应用软件。它提供了硬件抽象、设备驱动、函数库、可视化工具、消息传递和软件包管理等诸多功能。ROS遵循BSD开源许可协议。 随着机器人智…...

Submodule命令:android如何将自己项目中的某个Module作为gitlab中第三方公共库

一、创建远程公共库 1、Android Studio创建本地仓库 创建一个新的module 在新建module中添加代码(此处示例代码) 右击新建的module&#xff0c;打开新建module的命令行界面&#xff0c; 因为我们只上传这个module的代码&#xff0c;而不是整个项目的代码 命令行中输入以下命令…...

MySQL索引事务

1.索引1.1概念索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c;并指定索引的类型&#xff0c;各类索引有各自的数据结果实现。&#xff08;这里只用通俗的语言和图片进行介绍&#xff09;1.2作用数据库中的表…...

ISO27001信息安全管理体系认证

​ISO信息安全管理体系认证 一、什么是ISO信息安全管理体系认证&#xff1f; ISO是信息安全管理体系认证&#xff0c;是由国际标准化组织&#xff08;ISO&#xff09;采纳英国标准协会BS-2标准后实施的管理体系&#xff0c;成为了“信息安全管理”的国际通用语言&#xff0c;企…...

Linux应用GUI开发C++ 之gtkmm4(1)

目录概述GTKgtkmm安装gtkmm4hello,worldcodelite配置代码解释概述 GTK GTK是一个小部件工具包。GTK创建的每个用户界面都由小部件组成。这是在C语言中使用GObject实现的&#xff0c;GObject是一个面向对象的C语言框架。窗口小部件是主容器。然后通过向窗口中添加按钮、下拉菜…...

选课系统的设计与实现

技术&#xff1a;Java等摘要&#xff1a;目前国内各高校的规模越来越大&#xff0c;进而造成教师教学管理等工作量日趋加大。然而&#xff0c;现代教育的信息化、网络化已经成为教育发展的一个重要方向&#xff0c;同时也为解决高校教学管理效率低下的现状&#xff0c;使管理突…...

关于安卓的一些残缺笔记

安卓笔记Android应用项目的开发过程Android的调试Android项目文档结构Intent的显式/隐式调用Activity的生命周期1个Activity界面涉及到生命周期的情况2个Activity界面涉及到生命周期的情况Android布局的理论讲解Activity界面布局ContentProvider是如何实现数据共享Android整体架…...

MySQL 中的锁有哪些类型,MySQL 中加锁的原则

锁的类型MySQL 找那个根据加锁的范围&#xff0c;大致可以分成全局锁&#xff0c;表级锁和行级锁。全局锁全局锁&#xff0c;就是对整个数据库加锁。加锁flush tables with read lock解锁unlock tables全局锁会让整个库处于只读状态&#xff0c;之后所有的更新操作都会被阻塞&a…...

Winform中操作Sqlite数据增删改查、程序启动时执行创建表初始化操作

场景 Sqlite数据库 SQLite是一个进程内的库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。 它是一个零配置的数据库&#xff0c;这意味着与其他数据库不一样&#xff0c;您不需要在系统中配置。 就像其他数据库&#xff0c;SQLite 引擎不…...

2023最新版本RabbitMQ下载安装教程

一、RabbitMQ简介 RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。主要用于在进程、应用程序和服务器之间交换数据&#xff0c;可以通过插件支持进行扩展&#xff0c;支持许多协议&#xff0c;并提供高性能、可靠性、集群和高可用队列。 AMQP &#xff1a;Advanced Me…...

如何使用码匠连接 Elasticsearch

目录 在码匠中集成 Elasticsearch 在码匠中使用 Elasticsearch 关于码匠 Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;常用于处理大规模数据集的搜索、实时数据分析和数据挖掘任务。它支持多种数据源&#xff0c;包括关系型数据库&#xff08;如 MySQL、Pos…...

jmeter学习笔记二(jmeter函数与后置处理器)

Jmeter重要的函数 ${__counter(,)} 计数器 ​ ${__counter(TRUE,)} 默认加1; TRUE&#xff0c;每个用户有自己的计数器&#xff1b;FALSE&#xff0c;使用全局计数器 ​ 计数器元件&#xff0c;可以设置起始值&#xff0c;间隔值&#xff0c;最大值。运行结果超过最大值时&a…...

【独家】华为OD机试提供C语言题解 - 子序列长度

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明子序…...

Java之注解

注解1.1 注解的概念1.2 内置注解1.3 元注解1.4 自定义注解1.1 注解的概念 Annotation 是从JDK5.0 开始引入的新技术 Annotation的作用&#xff1a; 不是程序本身&#xff0c;可以对程序做出解释&#xff08;这一点和注释comment没什么区别&#xff09;可以被其他程序&#xff…...

【C++】string

【C修炼秘籍】string 目录 【C修炼秘籍】string 文章目录 前言 一、标准库里的string 二、string常用接口功能简介&#xff08;具体使用和底层转到模拟实现&#xff09; 1、string类的常见构造函数 2、string类对象的容量操作 3、string类对象的访问及遍历操作 4、 string类对象…...

JVM详解——执行引擎

如果有兴趣了解更多相关内容&#xff0c;欢迎来我的个人网站看看&#xff1a;耶瞳空间 一&#xff1a;执行引擎介绍 “虚拟机”是一个相对于“物理机”的概念&#xff0c;这两种机器都有代码执行能力&#xff0c;其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和…...

python学习——【第二弹】

前言 上一篇文章 python学习——【第一弹】给大家介绍了python中的基本数据类型等&#xff0c;这篇文章接着学习python中的运算符的相关内容。 运算符 python中的运算符主要有&#xff1a;算术运算符&#xff0c;赋值运算符&#xff0c;比较运算符&#xff0c;布尔运算符以及…...

242. 有效的字母异位词 349. 两个数组的交集

给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a; 若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 示例 1: 输入: s “anagram”, t “nagaram” 输出: true 示例 2: 输入: s “rat…...

辽宁城市建设网站/百度排名优化

Autotools包含一系列工具&#xff1a;automake、autoconf、autoscan、aclocal等工具组成&#xff0c;使用这组工具可以生成一个完整项目的Makefile。还是看流程图一目了然&#xff1a; 1、准备源文件 以最简单的helloworld为例&#xff1a; bookUbuntu:~/work/Autotools$ l…...

简述建立一个网站模板步骤/百度站长app

CentOS的yum源中没有git&#xff0c;只能自己编译安装&#xff0c;现在记录下编译安装的内容&#xff0c;留给自己备忘。 确保已安装了依赖的包 yum install curl yum install curl-devel yum install zlib-devel yum install openssl-devel yum install perl yum install cpio…...

手机网站开发注意的问题/竞价是什么工作

项目在debug环境下运行没有问题&#xff0c;在混淆打包之后却发现了闪退&#xff0c;无奈只能打开Log日志打印毛病~ 程序打印空指针异常&#xff0c;定位到空指针异常的地方~ 问题直指javaBean&#xff0c;于是我检查了我参考网上关于fastjson混淆的方法如下图 感觉没毛病啊…...

如何做网站卖画/百度联盟个人怎么接广告

目录一、神经网络简介1、神经网络是什么2、神经网络分类a.前馈式网络b.反馈式网络c.图网络3、神经网络应用二、神经网络编程基础1、激活函数a.什么是激活函数b.为什么要用激活函数c.常用激活函数2、逻辑回归a.损失函数b.成本函数三、神经网络结构与原理1、基本结构及表示方法a.…...

哪个网站原创文章/杭州seo公司

增加数据插入与二分查找法&#xff1a; /*** 描述 数组的操作* 项目名称 Java_DataStruct* 包名 com.java.array* 类名 ArrayDemo* author chenlin* date 2010年5月22日 下午3:45:49* version 1.0*/public class ArrayDemo2 {private int[] arr;// 有效数据大小private int le…...

织梦做的相亲网站/今日最新国内新闻重大事件

ntity Framework学习初级篇4--Entity SQL 时间:2010-02-05 博客园 ♂风车车.NetEntity SQl是ADO.NET实体框架提供的SQl类语言&#xff0c;用于支持实体数据模型(EDM)。Entity SQl可用于对象查询和使用EntityClient提供程序执行的查询。 l 关键字 Value关键字 ESQl提供了SELEC…...