分类 Linux 下的文章

Linux: 编译安装Python指定版本


描述

需要一个指定版本的python,而且需要源码编译。这里用的是3.8.9,不同版本的编译大同小异。

下载指定python版本

python下载地址python38

解压并进入目录

tar xvf python-3.8.9.tar.xz
cd Python-3.8.9

配置及编译

./configure --enable-shared --enable-optimizations --prefix=/home/ciomp/public/python38
make
make install

查看结果

屏幕截图 2023-04-18 150608.png


Qt: Ubuntu 22.04 源码编译 Qt5.12.11


需求

想着在linux下编译安装不同版本的qt来配置不同的环境,这样就需要分别源码编译qt的不同版本

下载Qt

去[https://download.qt.io/archive/qt/]找到对应自己想要处理的版本。

Qt 5.12.11官网下载

解压对应的压缩包

tar –xvf qt-everywhere-src-5.12.11.tar.xz

基础环境安装

sudo apt-get install libgl1-mesa-dev libglu1-mesa-dev libxkbcommon-x11-dev libfontconfig1-dev python3 python-is-python3 libxcb-xfixes0-dev libxcb-util-dev

开始配置编译

1 .新建一个Qt的安装目录

mkdir /home/ciomp/public/Qt5.12.11

2 .进入Qt源码目录进行配置和编译

./configure -shared -release -recheck-all -nomake examples -nomake tests -qt-xcb -opensource -confirm-license -platform linux-g++-64 -prefix /home/ciomp/public/Qt5.12.11/

configure配置项说明

-shared 动态编译(.so文件) 还可以用-static配置项来配置静态编译(.a文件)
-release 编译release
-nomake examples 不编译examples
-nomake test 不便宜tests
-opensource 编译开源版本 -commercial商业版本
-confirm-license 自动确认许可证
-platform linux-g++-64 编译器
-prefix /home/ciomp/public/Qt5.12.11/ 安装路径

configure时会有一些报错

qendian.h、qbytearraymatcher.h、qqmlprofilerevent_p.h分别会报一下错误。

error: ‘numeric_limits’ is not a member of ‘std’

  • /home/ciomp/code/qt-everywhere-src-5.12.11/qtbase/src/corelib/global/qendian.h
  • /home/ciomp/code/qt-everywhere-src-5.12.11/qtbase/src/corelib/tools/qbytearraymatcher.h
  • /home/ciomp/code/qt-everywhere-src-5.12.11/qtdeclarative/src/qmldebug/qqmlprofilerevent_p.h

这些文件的代码需要添加一下两个头文件

#include <stdexcept>
#include <limits>

3 .make
make时会也会出现以下错误,也得需要修改一下头文件

convert.cpp:6:56: error: ‘int32_t’ was not declared in this scope

  • /home/ciomp/code/qt-everywhere-src-5.12.11/qtlocation/src/3rdparty/mapbox-gl-native/src/mbgl/util/convert.cpp

这个文件需要添加的头文件

#include<stdint.h>

4 .make install

使用

设置一下环境变量或者直接进入到安装目录下的bin查看一下是否安装成功

PATH=/home/ciomp/public/Qt5.12.11/bin:$PATH
LD_LIBRARY_PATH=/home/ciomp/public/Qt5.12.11/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH
qmake --version

结果

屏幕截图 2023-04-15 112326.png


MSVC中的_BitScanForward和GCC中的__builtin_ctzl


问题

索博尔算法中用到了_BitScanForward这个函数,在做统信UOS适配的时候发现这个函数是MSVC专有的,百度了一下linux下对应的有__builtin_ctz相关的系列函数

头文件引用

*winlinux
头文件intrin.hx86intrin.h
函数_BitScanForward__builtin_ctzl

代码对比

win

#include <iostream>
#include <intrin.h>
using namespace std;

#pragma intrinsic(_BitScanForward)

static const unsigned QRNG_NDMS = 32;
    struct
    {
        unsigned __int64 uValue;
        unsigned uPrevSeed;
    } m_prev[QRNG_NDMS];

unsigned __int64 cjn[QRNG_NDMS][63] = { 0 };

int main()
{
    unsigned long mask = 0;
    unsigned long index;
    unsigned char isNonzero;

    unsigned m_uCurSeed = 2048,m_uCurDim;
    m_uCurDim = 0;
    unsigned grayCode = (m_uCurSeed >> 1) ^ m_uCurSeed;
    unsigned changedBits = m_prev[m_uCurDim].uPrevSeed ^ grayCode;
    unsigned long uBit;
    
    while (_BitScanForward(&uBit, changedBits))
    {
        cout << uBit << endl << changedBits <<endl;
        m_prev[m_uCurDim].uValue ^= cjn[m_uCurDim][uBit];
        changedBits &= ~(1 << uBit);
    }
    
    cout << uBit << endl << changedBits <<endl;

    return 0;
}

Linux

#include <iostream>
#include <x86intrin.h>

using namespace std;

static const unsigned QRNG_NDMS = 32;
    struct
    {
        unsigned long long uValue;
        unsigned uPrevSeed;
    } m_prev[QRNG_NDMS];

unsigned long long cjn[QRNG_NDMS][63] = { 0 };

int main(int, char**) {
    unsigned long mask = 0;
    unsigned long index = 0;
    unsigned char isNonzero;

    unsigned m_uCurSeed = 2048,m_uCurDim;
    m_uCurDim = 0;
    unsigned grayCode = (m_uCurSeed >> 1) ^ m_uCurSeed;
    unsigned changedBits = m_prev[m_uCurDim].uPrevSeed ^ grayCode;
    unsigned long uBit;
    cout << __builtin_ctzl(10) << endl;
    while (true)
    {
        uBit = __builtin_ctzl(changedBits);
        if(uBit >= 64){
            break;
        }
        cout << uBit << endl << changedBits <<endl;
        m_prev[m_uCurDim].uValue ^= cjn[m_uCurDim][uBit];
        changedBits &= ~(1 << uBit);
    }
    
    cout << uBit << endl << changedBits <<endl;
}

C/C++ Linux创建文件夹


描述

系统做linux适配的时候发现不能追迹,最后检查发现不能在对应目录创建相关文件夹导致的。

包含头文件

#include <sys/stat.h>  
#include <sys/types.h>

函数

函数原型:   int mkdir(const char *pathname, mode_t mode);   
函数说明:   mkdir()函数以mode方式创建一个以参数pathname命名的目录,mode定义新创建目录的权限。   
返回值:   若目录创建成功,则返回0;否则返回-1,并将错误记录到全局变量errno中。

mode模式类型:

S_IRWXU 00700权限,代表该文件所有者拥有读,写和执行操作的权限
S_IRUSR(S_IREAD) 00400权限,代表该文件所有者拥有可读的权限
S_IWUSR(S_IWRITE) 00200权限,代表该文件所有者拥有可写的权限
S_IXUSR(S_IEXEC) 00100权限,代表该文件所有者拥有执行的权限
S_IRWXG 00070权限,代表该文件用户组拥有读,写和执行操作的权限
S_IRGRP 00040权限,代表该文件用户组拥有可读的权限
S_IWGRP 00020权限,代表该文件用户组拥有可写的权限
S_IXGRP 00010权限,代表该文件用户组拥有执行的权限
S_IRWXO 00007权限,代表其他用户拥有读,写和执行操作的权限
S_IROTH 00004权限,代表其他用户拥有可读的权限
S_IWOTH 00002权限,代表其他用户拥有可写的权限
S_IXOTH 00001权限,代表其他用户拥有执行的权限

示例结果

屏幕截图 2023-03-29 071402.png


测试: 内网速度测试


需求

树莓派挂上了2T的硬盘做数据盘以及备份盘,最初用的wifi2G连的(为了线少),发现速度不够用啊,然后换成5G速度还是不够用。最终决定还是把网线连上来提升速度。路由器是千兆的口,无线还是不够用。
局域网内速度测试这里用到Iperf这款工具软件。

速度对比

-wifi 2.4Gwifi 5G有线千兆
速度1Mbps100Mbps900Mbps

Iperf工具介绍

Iperf 是一个网络性能测试工具。Iperf可以测试最大TCP和UDP带宽性能,具有多种参数和UDP特性,可以根据需要调整,可以报告带宽、延迟抖动和数据包丢失。

Iperf工具使用

Iperf下载地址

1.下载与安装

Widows可以去官网下载,下载后解压,无需安装。
linux(ubuntu20.04)可以直接安装 apt install iperf3

使用

因为linux做服务端的话需要处理防火墙,所以直接让win做服务端,linux做客户端来测试。

SERVER 服务端启动命令

iperf3.exe -s

CLIENT 客户端启动命令

iperf3 -c 192.168.31.240(服务端地址)

测试结果

嗯,千兆舒服!
屏幕截图 2022-11-21 175337.jpg