arm平台编译so文件回顾

2023-12-16

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

在编译arm平台so文件时,完成了以下的几个点:

1、根据第三方开源的build.sh文件编译第三方开源库,至于build.sh文件怎么写,大概是看开源仓的README文件吧。

2、写了一个MakeFile文件并运行编译了.a文件。最近查资料的时候获取到一个知识点就是,其实.a就是所有.o文件的集合。

3、根据子文件夹Makefile文件编译子文件夹.a文件。

4、解决编译过程中的多个问题


一、几个点

1、目标

在arm机器上编译出arm平台上可用的so文件

2、机器系统

[root@ncn4a-mapopenservice-34-12-242 ~]# uname -a
Linux ncn4a-mapopenservice-34-12-242 4.19.36-vhulk1907.1.0.h1393.eulerosv2r8.aarch64 #1 SMP Thu Jan 5 17:52:22 UTC 2023 aarch64 aarch64 aarch64 GNU/Linux

3、build.sh和Makefile领悟

接前言。现在理解了build和Makefile的区别。源于我将makefile的文件内容放在了build.sh脚本中。然后感觉突然恍然大悟。

Makefile文件是用来编译代码的。里面是有CXXFLAGS,就是将.c//cpp文件编译成.a文件。

OBJ关键词就要编译成.a还是.so文件格式。

而build.sh文件其实就是linux指令集合文件,里面写了编译库的很多指令。其中就包括调用makefile的一步,即调用make指令。

所以build.sh和makefile是有比较大的区别的。

而且自己写的代码只需要编写Makefile就可以了,即只需要Makefile就可以了。因为用不到第三方开源库的.configure、make install。只需要一个make就可以了,所以写个make就可以执行了。

二、过程回顾

1.上来就执行Makefile

拿到studio_compile工程后,以为是直接执行build就可以了。但是执行时报了一个文件格式不对的错误

[2023-12-06 16:38:38]  [root@ncn4a-mapopenservice-34-12-242 compile_wrapper]# ll
[2023-12-06 16:38:39]  total 16
[2023-12-06 16:38:39]  drwxrwxr-x 2 root root 4096 Apr 27  2023 include
[2023-12-06 16:38:39]  -rw-rw-r-- 1 root root 1926 Apr 27  2023 Makefile
[2023-12-06 16:38:39]  drwxrwxr-x 2 root root 4096 Apr 27  2023 src
[2023-12-06 16:38:39]  drwxrwxr-x 2 root root 4096 Apr 27  2023 vs
[2023-12-06 16:38:39]  [root@ncn4a-mapopenservice-34-12-242 compile_wrapper]# make -jm98
[2023-12-06 16:38:47]  g++ -Werror=return-type -std=c++0x -Wl,-z,relro,-z,now,-z,noexecstack -D_FORTIFY_SOURCE=2 -O2 -s -ftrapv -fPIC -fstack-protector-all -w -c -shared -o -D__STDC_LIMIT_MACROS -Dlinux -I. -I./include -I../model/include -I../common/include -I../compiler/include -I../configurator/include -I../operation/include -I../preprocessor/include -I../pbencoder/include -I../../../3rd/gdal/include/linux -I../../../3rd/gdal/src/libtiff\include -I../../../3rd/boost/include -I../../../3rd/jni/include/linux -I../../../3rd/protobuf/include -I../../../3rd/sqlite/include -I../../../3rd/zlib/include/linux -I../../../platform/HuaweiSecureC/include  src/com_huawei_mobilegis_data_studiocompile_engine_NativeEngine.cpp -o src/com_huawei_mobilegis_data_studiocompile_engine_NativeEngine.o
[2023-12-06 16:38:47]  g++ -Werror=return-type -std=c++0x -Wl,-z,relro,-z,now,-z,noexecstack -D_FORTIFY_SOURCE=2 -O2 -s -ftrapv -fPIC -fstack-protector-all -w -c -shared -o -D__STDC_LIMIT_MACROS -Dlinux -I. -I./include -I../model/include -I../common/include -I../compiler/include -I../configurator/include -I../operation/include -I../preprocessor/include -I../pbencoder/include -I../../../3rd/gdal/include/linux -I../../../3rd/gdal/src/libtiff\include -I../../../3rd/boost/include -I../../../3rd/jni/include/linux -I../../../3rd/protobuf/include -I../../../3rd/sqlite/include -I../../../3rd/zlib/include/linux -I../../../platform/HuaweiSecureC/include  src/CompileLayerWrapper.cpp -o src/CompileLayerWrapper.o
[2023-12-06 16:38:47]  g++ -Werror=return-type -std=c++0x -Wl,-z,relro,-z,now,-z,noexecstack -D_FORTIFY_SOURCE=2 -O2 -s -ftrapv -fPIC -fstack-protector-all -w -c -shared -o -D__STDC_LIMIT_MACROS -Dlinux -I. -I./include -I../model/include -I../common/include -I../compiler/include -I../configurator/include -I../operation/include -I../preprocessor/include -I../pbencoder/include -I../../../3rd/gdal/include/linux -I../../../3rd/gdal/src/libtiff\include -I../../../3rd/boost/include -I../../../3rd/jni/include/linux -I../../../3rd/protobuf/include -I../../../3rd/sqlite/include -I../../../3rd/zlib/include/linux -I../../../platform/HuaweiSecureC/include  src/ParseJNIObj.cpp -o src/ParseJNIObj.o
[2023-12-06 16:38:47]  g++ -Wl,-z,relro,-z,now,-z,noexecstack -D_FORTIFY_SOURCE=2 -O2 -s -ftrapv -fPIC -fstack-protector-all -static-libstdc++ -shared -o libcompile_wrapper.so ./src/com_huawei_mobilegis_data_studiocompile_engine_NativeEngine.o ./src/CompileLayerWrapper.o ./src/ParseJNIObj.o  -L../../../build/lib/linux -lcompiler -lconfigurator -lpreprocessor -lpbencoder -loperation -lcommon -L../../../3rd/gdal/lib/linux -lgdal -lgeos_c -lgeos -lproj -ljson-c -L../../../3rd/boost/lib/linux -lboost_serialization -lboost_filesystem -lboost_system -lboost_thread -L../../../3rd/protobuf/lib/linux -lprotobuf -L../../../3rd/sqlite/lib/linux/ -lsqlite3 -L../../../3rd/zlib/lib/linux/ -lz -L../../../3rd/gdal/src/libtiff/lib -ltiff -L../../../platform/HuaweiSecureC/lib/linux/ -lsecurec -ldl -lpthread
[2023-12-06 16:39:02]  /usr/bin/ld:../../../3rd/gdal/lib/linux/libgdal.a: file format not recognized; treating as linker script
[2023-12-06 16:39:02]  /usr/bin/ld:../../../3rd/gdal/lib/linux/libgdal.a:1: syntax error
[2023-12-06 16:39:02]  collect2: error: ld returned 1 exit status
[2023-12-06 16:39:02]  make: *** [Makefile:43: all] Error 1

即这一条:

 /usr/bin/ld:../../../3rd/gdal/lib/linux/libgdal.a: file format not recognized; treating as linker script

然后就查看一下libgdal.a文件格式,使用file (filename)指令

[2023-12-06 17:41:48]  [root@ncn4a-mapopenservice-34-12-242 linux]# file libgdal.a 
[2023-12-06 17:41:58]  libgdal.a: ASCII text
[2023-12-06 17:41:58]  [root@ncn4a-mapopenservice-34-12-242 linux]# timed out waiting for input: auto-logout

这个显示情况其实还看不出来文件格式。这个ACII text文件其实是因为.a文件在windows环境下解压导致文件格式出问题了。但是其实正常的,也会是x86的格式,不是arm的格式。总而言之,就是报错格式不对。

这个文件是第三方开源库静态库文件,所以需要编译第三方开源静态库。

其实后来按照心哥的说法,即便格式没有变成ASCII码也是需要重新编译第三方开源库的,因为平台变了,之前的.a文件是x86格式的。

这边不得不吐槽,上传到git上的.a文件真是一点用没有啊。

2、编译第三方开源库.a文件

先后编译boost库、protobuf、sqlite、zlib、gdal库。其中有两个点需要单独领出来看。一个就是gdal库,还有一个就是没有Makefile然后我自己写的makefile文件编译的。

先说gdal库。gdal需要依赖tiff库、json-c库、geos库、proj库,最后才是安装gdal库。这边也是这次才理解的就是。就是对于这几个库,自己感觉是编译,其实也是在机器上安装这个库。可以用-- v查看版本号的。

是的,所以查看版本号方式

protobuf protoc --version
gdal gdalinfo --version

额,过了两天差版本号竟然都查不到。。。

然后这几个开源库用的build.sh脚本编译的。

后来就一直查不到版本号,我骑车的时候突然想到,会不会是我没有设置环境变量呢?先不纠结了,因为也没有太大的影响。

2.1 build.sh

build.sh基本格式就是以下形式

PREFIX_INC_PATH=$(cd "$(dirname "$0")";pwd) //获取当前脚本路径

#!/bin/bash

必须
set -e
set -x

“set -e” 若指令传回值不等于0,则立即退出shell

执行指令后,会先显示该指令及所下的参数

注释②

git下载 备注
解压
更改文件夹名(可选) 可选
进入含有configure文件的文件夹中 有的新版本没有configure文件,一般是要执行autogen.sh文件生成
执行./configure --prefix=【prefix_path】,//设置安装路径 安装后的文件就在prefix_path路径中
--enable-xxx  /   --disable-xxx 不懂
--with-xxx  /  --without-xxx 不懂
--build=arm-linux  //设置编译环境 国产arm机器需要设置平台环境,不然会configure失败,导致build.sh失败

SQLITE3_CFLAGS=路径

不懂

SQLITE3_LIBS=路径 -lsqlite3

不懂

sh autogen.sh 或 autoreconf

不懂,但是要安装autoconf全家桶,可以参考本人帖子。注释①
make -j8 编译
make install 安装
移动OBJ文件 可选
cp -f boost_install/lboost.a ../lib/linux/ 将静态库文件移动到lib文件夹
cp -rf boost_install/include ../ 将include文件拷贝到src同级路径
【完成】

注释①: 报错处理集-CSDN博客

注释②: https://www.cnblogs.com/wangzy-Zj/p/17296118.html

2.2 Makefile

Makefile的格式大概如下

CXXFLAGS=

用于将.c或.cpp文件编译成.o文件,编译格式为

$(CXX) $(CXXFLAGS) $*.cpp -o $@

CXX= CXX = xxx指定编译器

搜到这个帖子说的比较详细: Linux Makefile入门总结-CSDN博客

看完这个贴子,增加了对以下几个知识点的了解

元素 说明 备注

目标文件 : 依赖文件

[TAB]命令

[TAB]:是你键盘左边tab键
-c -c 是生成 .o 文件的必要参数! gcc -c main.c -o main.o
.PHONY: clean 用来屏蔽同名clean的文件夹或文件

= :变量(可修改)

+= :追加

:= :常量(不可修改)

TARGET = test

CXX := g++

$(TARGET) # 相当于C语言的宏定义
%c、%cpp、%o 隐含规则: 任意的.c 或 任意的.cpp 或 任意的.o 使用%c 或 %cpp 或 %o 或 %h 时,优先加点'.'使用,如:%.c、%.cpp、%.o、%.h
*.c、*.cpp、*.o 所有的.c 或 所有的.cpp 或 所有的.o
$^

所有的依赖文件

依赖文件 :我要做这个操作,依赖哪些东西

$(TARGET):  $(OBJ)         $(CXX) $^ -o $@
$< 所有依赖文件的第一个文件(应该也是最匹配的一个文件) %.o: %cpp  $(CXX)         $(CXXFLAGS) $< -o $@
$@

所有的目标文件

目标文件 :我要做这个操作,要生成的东西;

CXXFLAGS

CXXFLAGS = -c -Wall

类似于宏替换

SRC = $( wildcard *.cpp) 获取项目路径下的所有.cpp源文件
OBJ = $(patsubst %.cpp, %.o, $(SRC)) 根据源文件链接成 .o 文件 wildcard 和 patsubst 是Makefile函数的用法
-wall 编译后显示所有警告 Makefile 中 -g、-o、-c、-f 、-D、-Wall、-L、含义 | 码农家园

这个帖子绝佳,搞明白很多之前的疑问,赞! Makefile 中 -g、-o、-c、-f 、-D、-Wall、-L、含义 | 码农家园

3、最终编译

继续回顾流程,显示用各个开源库的build.sh脚本把各个开源库编译一遍。再把子文件夹用Makefile编译一遍,这个上面的帖子也说了,每个子文件夹都有一个Makefile

这其中还有一个很奇怪的一个点,就是工程写了一个build.sh脚本,是进入每个子文件夹分别执行Makefile,这个也是一个知识点。但这不是重点,重点是用这个build.sh脚本执行编译时,过程中会因为MobaXterm出现network断开导致编译失败,所以我是对子文件夹单独编译的。可以编好。就很奇怪。

到此第三方开源库、子文件的静态库都编好了。其中过程中遇到好几个问题,通过百度都解决了,也记录在自己的文章中了。 报错处理集-CSDN博客 ,现在就开始编译最终的so文件了。

这其中还有一个知识点就是,其实我之前理解的所谓交叉编译环境是在x86机器上安装检查编译工具。但是过程中问了心哥知道其实我用的这个欧拉系统是arm环境,所以交叉编译是不是只能用arm机器呢,这个问题留存解决。

解释:百度了一下,理解了,意思就是交叉编译是因为目标平台可能不支持编译或者资源不够,跨平台编译就叫交叉编译。如果像我这样就不算交叉编译了吧。

【百度百科:

一个经常会被问到的问题就是,“既然我们已经有了主机 编译器 ,那为什么还要交叉编译呢?”其实答案很简单。有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。

另一个经常会被问到的问题就是:“既然可以交叉编译,那还要主机编译干吗?”其实答案也很简单,交叉编译是 不得已而为之 !与主机编译相比,交叉编译受的限制更多,虽然在理论上我们可以做任何形式的交叉编译,但事实上,由于受到专利、版权、技术的限制,并不总是能够进行交叉编译,尤其是在业余条件下!举例来说,我们至今无法生成 惠普公司 专有的som格式的 可执行文件 ,因此我们根本无法做目的平台为HPPA-HPUX的交叉编译。 来源: 交叉编译_百度百科

还有一点就是这次编译过程比较复杂,一方面是因为机器是离线的,很多是要离线安装的。但是问了心哥,说可以用yum install在线安装,试了确实可以。这个可能跟是欧拉系统有关。

三、其他知识点

1、这边还有一个关于x86和arm平台区别的知识点,找到这篇帖子: https://www.cnblogs.com/kin-zhang/p/15031633.html

2、Makefile里面可以直接把.a换成.so吗?编译.a和编译.so的Makefile有什么区别?

这个需要后面了解下

Makefile链接静态库.a编译成动态库.so_makefile 链接.a-CSDN博客

3、linux安装git的用户设置

当时准备安装git拉取代码的,不过发现并不可行,所以没有深究下去。后面可以了解下。

4、LIB = ar cr什么意思,未知,后面要了解下

5、这个shell脚本遇到一个新的写法

#!/bin/sh
set -x
libtoolize --force --copy
aclocal -I ./m4
autoheader
automake --foreign --add-missing --copy
autoconf
# Get latest config.guess and config.sub from upstream master since
# these are often out of date.
for file in config.guess config.sub
do
    echo "$0: getting $file..."
    wget -q --timeout=5 -O config/$file.tmp \
      "https://git.savannah.gnu.org/cgit/config.git/plain/${file}" \
      && mv config/$file.tmp config/$file \
      && chmod a+x config/$file
    retval=$?
    rm -f config/$file.tmp
    test $retval -eq 0 || exit $retval
done

这里面有个循环。这个写法一开始没有看懂。是在下载两个文件。

这两个文件是【file in config.guess config.sub】

四、未完待续

4.1 错误1

后来竟然还报了这样一个错误

undefined symbol: _ZN6google8protobuf8internal28init_protobuf_defaults_stateE

上百度查原因,查这个报错,但是几乎是一无所获。找了一下午也没有一个正规的说法和解释。有点放弃的感觉,然后就拖到第二天,别人问进度,进度为0。和习贺问了下,提到这个函数"init_protobuf_defaults_stateE"在代码中哪里。有点启发,我之前都没有查过这个函数在程序中的情况。然后就尝试着查了下。不查不知道,一查吓一跳。

自己使用的3.12.2版本protobuf代码

应该使用的3.19.3版本的protobuf代码

所以我用的版本根本就不对啊!!

需要换成程序对应的版本重新编译。从这件事来看,版本间的差异是挺大的,不能想当然的使用版本!

这次编好就部署成功啦。完结撒花!!


上面的是线下编译成功了,dragonCloud上适配就有问题了

报错1:syntax error: unexpected end of file

需要vim 一下你的文件,然后:set fileformat=unix,:wq保存即可。


总结

对整个编译过程进行了总结,是有意义的,编成功了。但是经验不复用应该是不好的,需要把经验积累下来。突然想起来强哥之前一直说要经验复用,大概也是指的这个意思吧。

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

arm平台编译so文件回顾 的相关文章

  • 通过 Visual Studio 2017 使用远程调试时 Linux 控制台输出在哪里?

    我的Visual Studio 2017 VS2017 成功连接Linux系统 代码如下 include
  • tcpdump 是否受 iptables 过滤影响?

    如果我的开发机器有iptables规则到FORWARD一些数据包 这些数据包是否被 tcpdump 捕获 我有这个问题 因为我知道存在其他链称为INPUT如果数据包路由到 它会过滤发往应用程序的数据包FORWARD链 它会到达吗tcpdum
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 添加文件时运行 shell 命令

    我的 Linux 机器上有一个名为 images 的文件夹 该文件夹连接到一个网站 该网站的管理员可以向该网站添加图片 但是 当添加图片时 我想要一个命令来运行调整目录中所有图片的大小 简而言之 我想知道当新文件添加到特定位置时如何使服务器
  • 为什么 fopen("any_path_name",'r') 不给出 NULL 作为返回值?

    在调试一些代码时 我得到如下内容 include
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • 如何使用waf构建共享库?

    我想使用构建一个共享库waf http code google com p waf 因为它看起来比 GNU 自动工具更容易 更简洁 到目前为止 我实际上有几个与我开始编写的 wscript 有关的问题 VERSION 0 0 1 APPNA
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • 如何在 Linux 中使用 C 语言使用共享内存

    我的一个项目有点问题 我一直在试图找到一个有据可查的使用共享内存的例子fork 但没有成功 基本上情况是 当用户启动程序时 我需要在共享内存中存储两个值 当前路径这是一个char and a 文件名这也是char 根据命令参数 启动一个新进
  • 使用 python 脚本更改 shell 中的工作目录

    我想实现一个用户态命令 它将采用其参数之一 路径 并将目录更改为该目录 程序完成后 我希望 shell 位于该目录中 所以我想实施cd命令 但需要外部程序 可以在 python 脚本中完成还是我必须编写 bash 包装器 Example t
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • 检查已安装的软件包,如果没有找到则安装

    我需要检查已安装的软件包 如果未安装则安装它们 RHEL CentOS Fedora 示例 rpm qa grep glibc static glibc static 2 12 1 80 el6 3 5 i686 如何在 BASH 中进行检
  • 为什么同一个curl命令在windows和linux下输出不同的东西?

    为什么同样的curl o file https www link com 命令输出不同的东西 例如 如果我运行命令curl o source txt https www youtube com playlist list PLIx6Fwnp
  • 嵌入式 Linux – 部署固件更新的机制? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在考虑在 Yocto 项目上开发一个嵌入式 Linux 项目 一个工业应用程序 我有几个问题想问那些有嵌入式 Linux 经验的人 Y
  • 研究缓冲区溢出时应该使用哪些版本的 GCC 或标志?

    最近 作为计算机工程专业的本科生 我一直在研究缓冲区溢出 出于兴趣 我开始研究缓冲区溢出 但在尝试在我的计算机上用 GCC 4 9 1 在 Debian Jessie 中 编译的我自己的 C 程序中实现它们时遇到了困难 我听说较新的编译器中
  • 在运行时检查 GCC 版本

    我需要找出 C 程序执行过程中 运行时 可用的 系统中安装的 GCC 版本 主要版本和次要版本 意思是 以编程方式提取可用 gcc 的版本 就像我在 shell 中输入 gcc version 一样 但在 c 程序中 The GNUC an
  • 使用awk将列中的值替换为txt文件中的另一个值

    我是 Linux 和 awk 脚本编写的新手 我有 tab delim txt 文件 如下所示 AAA 134 145 Sat 150 167 AAA 156 167 Sat 150 167 AAA 175 187 Sat 150 167
  • 在 scp 的简单函数包装中使用波形符 ~ 时出现问题

    我想放置一个简单的bash功能在我的 bashrc围绕着scp通过接受 源 参数和 目标 参数来命令 到目前为止已经尝试过 function send eval scp 1 user annoyingly long server name

随机推荐

  • 深入理解软件测试中的Web请求流程!

    在软件开发的过程中 软件测试是不可或缺的一环 它有助于确保软件系统的稳定性 可靠性和安全性 而在众多测试中 Web请求流程的测试显得尤为重要 因为几乎所有的现代应用都离不开网络交互 接下来我们将深入探讨软件测试中完整的Web请求流程 帮助大
  • 组件升级回顾

    记录组件升级相关事宜 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 c 组件升级 一 背景 drogenCloud上编译代码 需要升级第三方开源库组件 一开始啥也不懂 不知怎么下手
  • 集成测试、单元测试、系统测试之间的关系和区别

    前言 为了使软件正常工作 所有单元都应集成在一起并正常运行 集成测试就像是要求不同工种的工人修建一个房子 希望他们都团结协作 如何判断他们在一起是否可以按照计划完成建设呢 唯一了解的方法是通过将它们全部拉在一起并测试它们如何相互作用来执行
  • 如何搭建自动化测试框架?8年测试老司机浅谈一下!

    公司使用python selenium pytest来做UI自动化测试 我经历了从0开始搭建自动化工程 开发测试报告web服务 编写测试用例 经过了一段时间的磨合 感觉已经比较顺手了 这里梳理下我采用的自动化工程目录组织结构 整体目录结构及
  • Jmeter 性能 —— 搭建skywalking监控平台!

    1 环境搭建 注意核对系统时间是否正确 Datentpdate pool ntp org 在任意目录新建一个docker compose的目录 cd homemkdir docker compose 在docker compose的目录下
  • 【计算机网络概述】第一章:概论 1.1什么是Internet

    学习目标 什么是网络 什么是计算机网络 什么是互联网 前言 温馨提示 该文章是小编学习计算机网络的笔记 参考中科大的郑老师hh 这一章是非常重要的 是为之后的学习进行打基础 我们需要努力学习这一章的内容 跨过这座山 他们就会听见你的故事 一
  • 自动化测试:PO模式详解!

    PO Page Object 模式是一种在自动化测试中常用的设计模式 将页面的每个元素封装成一个对象 通过操作对象来进行页面的交互 概括来说就是 每个页面都有对应的PO类 PO类中包含了页面的元素定位和操作方法 测试脚本只需要调用PO类中的
  • C++异常处理(try catch throw)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 牛客做到一个题目 是c 异常处理的 做的时候感觉很陌生 这边学习一下 一 题目
  • 微信小程序UI自动化测试实践:Minium+PageObject

    小程序架构上分为渲染层和逻辑层 尽管各平台的运行环境十分相似 但是还是有些许的区别 如下图 比如说JavaScript 语法和 API 支持不一致 WXSS 渲染表现也有不同 所以不论是手工测试 还是UI自动化测试 都必须要在 iOS 和
  • 新手上路:盘点「性能测试」必须掌握的技术点

    前段时间 有一些小伙伴提出希望我们推送点性能测试的技术干货 所以 小编今天通过上网查资料 结合项目实操过程中的一些问题 总结了一些关于性能测试的内容 希望是大家想要了解的内容哈 1 性能测试的目的 首先 先来明确一个问题 我们为什么要给产品
  • Postman高级应用——变量、流程控制、调试、公共函数、外部数据文件

    Postman 提供了四种类型的变量 环境变量 Environment Variable 不同的环境 使用不同的环境变量 例如 测试过程中经常会用到 测试环境 外网环境等 全局变量 Global Variable 所有的接口运环境中变量值都
  • STM32F103

    提示 来源正点原子 参考STM32F103 战舰开发指南V1 3PDF资料 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 开发环境硬件普中科技 接线图在g
  • jmeter实现webservice接口测试

    其实可以用jmeter两种sampler进行webservice的测试 1 SOAP XML RPC Request 但是在jmeter3 2以后版本中已经取消了这个取样器 2 HTTP请求 下面分别介绍两种方式 一 首先需要使用soupU
  • pytest结合 allure 打标记之的详细使用

    前言 前面我们提到使用allure 可以生成漂亮的测试报告 下面就Allure 标记我们做详细介绍 allure 标记 包含 epic feature story title testcase issue description step
  • selenium 网页自动化-在访问一个网页时弹出的浏览器窗口,我该如何处理?

    前言 相信大家在使用 selenium 做网页自动化时 会遇到如下这样的一个场景 在你使用get访问某一个网址时 会在页面中弹出如上图所示的弹出框 首先想到是利用Alert类来处理它 然而 很不幸 Alert类处理的结果就是没有结果 并不能
  • unittest 数据驱动DDT应用

    前言 一般进行接口测试时 每个接口的传参都不止一种情况 一般会考虑正向 逆向等多种组合 所以在测试一个接口时通常会编写多条case 而这些case除了传参不同外 其实并没什么区别 这个时候就可以利用ddt来管理测试数据 提高代码复用率 但要
  • Appium知多少

    Appium我想大家都不陌生 这是主流的移动自动化工具 但你对它真的了解么 为什么很多同学搭建环境时碰到各种问题也而不知该如何解决 appium为什么英语词典查不到中文含义 appium是一个合成词 分别取自 application 的前三
  • google Protobuf

    之前一直把第三方开源库protobuf编译 但是么用过没了解过 这次正好看到这篇文章 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 网易看到的protobuf的新闻 然后百度查到原文 记录一下
  • Jenkins部署python接口自动化测试

    一 点击新建Item 二 指定源码和分支 私钥位置 C Users Administrator ssh 文件下 三 构建脚本编写 四 构建后操作 指定输出的 allure 结果目录 总结 感谢每一个认真阅读我文章的人 作为一位过来人也是希望
  • arm平台编译so文件回顾

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 几个点 二 回顾过程 1 上来就执行Makefile 2 编译第三方开源库 a文件 2 1 build sh脚本 2 2 Make