在 openEuler 上使用 x86_64 环境编译 ARM64 应用的完整实践

openEuler Embedded Yocto构建 openEuler Embedded采用的面向嵌入式系统Yocto构建体系,而非openEuler服务器场景的OBS构建体系。虽然实现了内核和软件包在代码层面的共享,但在具体构建上有着巨大的差异,需要专门编写相应的构建文件,这也意味当前openEuler体系中众多软件包的构建规则不能直接应用于嵌入式场景。当前openEuler Embedded已经实现了250+软件包的支持,未来为了实现所有软件包的支持,显然不能把所有的软件包的构建在Yocto下重新实现一遍。 阅读详情

一、引言

在我的日常开发中,经常需要在 x86_64 服务器上编写代码,却要把最终程序部署到 ARM64 设备上,比如RK3568或树莓派。为了避免在目标设备上反复搭建环境、编译调试,我更倾向于直接在 openEuler 的 x86_64 环境里完成 ARM64 应用的构建,而交叉编译正好可以让我轻松实现这一点。

本文展示如何快速搭建交叉编译环境、编译C/C++/Go应用、进行性能对比验证,支持x86_64、ARM64、RISC-V多架构。

环境准备

在openEuler上安装交叉编译工具链:

# 更新系统
sudo dnf update -y

# 安装ARM64交叉编译工具链
sudo dnf install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

# 安装RISC-V交叉编译工具链(可选)
sudo dnf install -y gcc-riscv64-linux-gnu g++-riscv64-linux-gnu

# 验证安装
aarch64-linux-gnu-gcc --version
riscv64-linux-gnu-gcc --version

# 创建工作目录
mkdir -p ~/cross-compile/{x86_64,arm64,riscv64}
mkdir -p ~/cross-compile/src/{c,cpp,python,go}
mkdir -p ~/cross-compile/build/{x86_64,arm64,riscv64}
cd ~/cross-compile

img

C语言交叉编译实战

首先,我们先构建一个最基础但包含多项系统信息的 C 程序,以便在后续验证不同架构的编译结果。

主要就是显示一些系统信息、架构信息,编译器信息这些关键的信息。接下来我们再使用交叉编译工具链进行编译测试。

# 创建C源代码
cat > ~/cross-compile/src/c/hello.c << 'EOF'
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main() {
    printf("=== openEuler Cross-Compile Demo ===\n");
    printf("Hello from C application!\n");
    
    // 显示系统信息
    printf("\nSystem Information:\n");
    printf("Process ID: %d\n", getpid());
    printf("User ID: %d\n", getuid());
    
    // 显示架构信息
    #ifdef __aarch64__
        printf("Architecture: ARM64 (AArch64)\n");
    #elif defined(__x86_64__)
        printf("Architecture: x86_64\n");
    #elif defined(__riscv)
        printf("Architecture: RISC-V\n");
    #else
        printf("Architecture: Unknown\n");
    #endif
    
    // 显示编译器信息
    printf("Compiler: %s\n", __VERSION__);
    printf("Compiled at: %s %s\n", __DATE__, __TIME__);
    
    return 0;
}
EOF

# 验证源代码
cat ~/cross-compile/src/c/hello.c

编译为x86_64二进制:

gcc -o ~/cross-compile/build/x86_64/hello ~/cross-compile/src/c/hello.c
file ~/cross-compile/build/x86_64/hello
~/cross-compile/build/x86_64/hello

交叉编译为ARM64:

aarch64-linux-gnu-gcc -o ~/cross-compile/build/arm64/hello ~/cross-compile/src/c/hello.c
file ~/cross-compile/build/arm64/hello

# 使用QEMU运行ARM64版本
sudo dnf install -y qemu-user-static
qemu-aarch64-static ~/cross-compile/build/arm64/hello

img

交叉编译为RISC-V:

riscv64-linux-gnu-gcc -o ~/cross-compile/build/riscv64/hello ~/cross-compile/src/c/hello.c
file ~/cross-compile/build/riscv64/hello

img

C++应用交叉编译

创建C++应用:

# 创建C++源代码
cat > ~/cross-compile/src/cpp/app.cpp << 'EOF'
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

class Calculator {
public:
    double add(double a, double b) { return a + b; }
    double multiply(double a, double b) { return a * b; }
    double sqrt_value(double x) { return sqrt(x); }
};

int main() {
    cout << "=== openEuler C++ Cross-Compile Demo ===" << endl;
    
    Calculator calc;
    
    // 测试计算
    double result1 = calc.add(10.5, 20.3);
    double result2 = calc.multiply(5.0, 4.0);
    double result3 = calc.sqrt_value(16.0);
    
    cout << "10.5 + 20.3 = " << result1 << endl;
    cout << "5.0 * 4.0 = " << result2 << endl;
    cout << "sqrt(16.0) = " << result3 << endl;
    
    // 向量操作
    vector<int> numbers = {1, 2, 3, 4, 5};
    int sum = 0;
    for_each(numbers.begin(), numbers.end(), 
             [&sum](int n) { sum += n; });
    
    cout << "Sum of 1-5: " << sum << endl;
    
    return 0;
}
EOF

# 验证源代码
cat ~/cross-compile/src/cpp/app.cpp

编译C++应用:

# 编译x86_64版本
g++ -O2 -o ~/cross-compile/build/x86_64/app ~/cross-compile/src/cpp/app.cpp

# 交叉编译ARM64版本
aarch64-linux-gnu-g++ -O2 -o ~/cross-compile/build/arm64/app ~/cross-compile/src/cpp/app.cpp

# 运行测试
~/cross-compile/build/x86_64/app
qemu-aarch64-static ~/cross-compile/build/arm64/app

img

Go应用交叉编译

创建Go应用:

# 创建Go源代码
cat > ~/cross-compile/src/go/main.go << 'EOF'
package main

import (
        "fmt"
        "os"
        "runtime"
        "time"
)

func main() {
        fmt.Println("=== openEuler Go Cross-Compile Demo ===")
        fmt.Println()
        
        // 系统信息
        fmt.Println("System Information:")
        fmt.Printf("OS: %s\n", runtime.GOOS)
        fmt.Printf("Architecture: %s\n", runtime.GOARCH)
        fmt.Printf("Go Version: %s\n", runtime.Version())
        fmt.Printf("Num CPUs: %d\n", runtime.NumCPU())
        fmt.Println()
        
        // 进程信息
        fmt.Println("Process Information:")
        fmt.Printf("Process ID: %d\n", os.Getpid())
        fmt.Printf("User ID: %d\n", os.Getuid())
        fmt.Printf("Current Time: %s\n", time.Now())
        fmt.Println()
        
        // 计算演示
        fmt.Println("Calculation Demo:")
        numbers := []int{1, 2, 3, 4, 5}
        sum := 0
        for _, n := range numbers {
                sum += n
        }
        fmt.Printf("Numbers: %v\n", numbers)
        fmt.Printf("Sum: %d\n", sum)
        fmt.Printf("Average: %.2f\n", float64(sum)/float64(len(numbers)))
}
EOF

# 验证源代码
cat ~/cross-compile/src/go/main.go

编译Go应用:

cd ~/cross-compile/src/go

# 编译x86_64版本
go build -o ~/cross-compile/build/x86_64/app main.go

# 交叉编译ARM64版本
GOOS=linux GOARCH=arm64 go build -o ~/cross-compile/build/arm64/app main.go

# 交叉编译RISC-V版本
GOOS=linux GOARCH=riscv64 go build -o ~/cross-compile/build/riscv64/app main.go

# 运行测试
~/cross-compile/build/x86_64/app
qemu-aarch64-static ~/cross-compile/build/arm64/app

自动化编译脚本

创建统一编译脚本:

# 创建统一编译脚本
cat > ~/cross-compile/compile_all.sh << 'EOF'
#!/bin/bash

# openEuler交叉编译统一脚本

set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BUILD_DIR="$SCRIPT_DIR/build"
SRC_DIR="$SCRIPT_DIR/src"

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 编译C应用
compile_c() {
    log_info "编译C应用..."
    
    # x86_64
    gcc -O2 -o $BUILD_DIR/x86_64/hello $SRC_DIR/c/hello.c
    log_info "x86_64 C应用编译完成"
    
    # ARM64
    aarch64-linux-gnu-gcc -O2 -o $BUILD_DIR/arm64/hello $SRC_DIR/c/hello.c
    log_info "ARM64 C应用编译完成"
    
    # RISC-V
    riscv64-linux-gnu-gcc -O2 -o $BUILD_DIR/riscv64/hello $SRC_DIR/c/hello.c
    log_info "RISC-V C应用编译完成"
}

# 编译C++应用
compile_cpp() {
    log_info "编译C++应用..."
    
    # x86_64
    g++ -O2 -o $BUILD_DIR/x86_64/app $SRC_DIR/cpp/app.cpp
    log_info "x86_64 C++应用编译完成"
    
    # ARM64
    aarch64-linux-gnu-g++ -O2 -o $BUILD_DIR/arm64/app $SRC_DIR/cpp/app.cpp
    log_info "ARM64 C++应用编译完成"
}

# 编译Go应用
compile_go() {
    log_info "编译Go应用..."
    
    cd $SRC_DIR/go
    
    # x86_64
    go build -o $BUILD_DIR/x86_64/app main.go
    log_info "x86_64 Go应用编译完成"
    
    # ARM64
    GOOS=linux GOARCH=arm64 go build -o $BUILD_DIR/arm64/app main.go
    log_info "ARM64 Go应用编译完成"
    
    # RISC-V
    GOOS=linux GOARCH=riscv64 go build -o $BUILD_DIR/riscv64/app main.go
    log_info "RISC-V Go应用编译完成"
    
    cd $SCRIPT_DIR
}

# 显示编译结果
show_results() {
    log_info "编译结果汇总:"
    echo ""
    
    echo "【x86_64二进制】"
    ls -lh $BUILD_DIR/x86_64/ | grep -v "^total" | awk '{print $9, $5}'
    
    echo ""
    echo "【ARM64二进制】"
    ls -lh $BUILD_DIR/arm64/ | grep -v "^total" | awk '{print $9, $5}'
    
    echo ""
    echo "【RISC-V二进制】"
    ls -lh $BUILD_DIR/riscv64/ | grep -v "^total" | awk '{print $9, $5}'
}

# 主程序
main() {
    log_info "开始openEuler交叉编译..."
    echo ""
    
    compile_c
    echo ""
    
    compile_cpp
    echo ""
    
    compile_go
    echo ""
    
    show_results
    
    log_info "所有编译完成"
}

main "$@"
EOF

chmod +x ~/cross-compile/compile_all.sh

# 执行编译
cd ~/cross-compile && ./compile_all.sh

性能对比和验证

创建性能对比脚本:

# 创建性能对比脚本
cat > ~/cross-compile/performance_test.sh << 'EOF'
#!/bin/bash

echo "=== openEuler交叉编译性能对比 ==="
echo "测试环境: openEuler 22.03 LTS"
echo ""

# 测试编译速度
echo "【编译速度对比】"
echo ""

# 清理旧编译
rm -rf build/*

# 测试x86_64编译
echo "编译x86_64版本..."
start=$(date +%s%N)
gcc -O2 -o build/x86_64/hello src/c/hello.c
x86_64_time=$(( ($(date +%s%N) - start) / 1000000 ))
echo "x86_64编译时间: ${x86_64_time}ms"

# 测试ARM64交叉编译
echo "交叉编译ARM64版本..."
start=$(date +%s%N)
aarch64-linux-gnu-gcc -O2 -o build/arm64/hello src/c/hello.c
arm64_time=$(( ($(date +%s%N) - start) / 1000000 ))
echo "ARM64交叉编译时间: ${arm64_time}ms"

# 测试RISC-V交叉编译
echo "交叉编译RISC-V版本..."
start=$(date +%s%N)
riscv64-linux-gnu-gcc -O2 -o build/riscv64/hello src/c/hello.c
riscv64_time=$(( ($(date +%s%N) - start) / 1000000 ))
echo "RISC-V交叉编译时间: ${riscv64_time}ms"

echo ""
echo "【二进制大小对比】"
echo ""
ls -lh build/*/hello | awk '{printf "%-30s %s\n", $9, $5}'

echo ""
echo "【二进制类型验证】"
echo ""
file build/*/hello | sed 's|build/||g'

echo ""
echo "【运行时性能对比】"
echo ""

echo "x86_64版本运行时间:"
time build/x86_64/hello > /dev/null

echo ""
echo "ARM64版本运行时间 (使用QEMU):"
time qemu-aarch64-static build/arm64/hello > /dev/null
EOF

chmod +x ~/cross-compile/performance_test.sh
cd ~/cross-compile && ./performance_test.sh

img

实际应用案例

编译项目nginx:

# 下载nginx源代码
cd ~/cross-compile
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -xzf nginx-1.24.0.tar.gz
cd nginx-1.24.0

# 为x86_64编译nginx
echo "=== 编译x86_64版本nginx ==="
./configure --prefix=/usr/local/nginx-x86_64
make -j$(nproc)
make install DESTDIR=../build/x86_64/nginx

# 为ARM64交叉编译nginx
echo "=== 交叉编译ARM64版本nginx ==="
CC=aarch64-linux-gnu-gcc \
./configure --prefix=/usr/local/nginx-arm64 \
    --host=aarch64-linux-gnu
make -j$(nproc)
make install DESTDIR=../build/arm64/nginx

# 验证编译结果
file ../build/x86_64/nginx/usr/local/nginx-x86_64/sbin/nginx
file ../build/arm64/nginx/usr/local/nginx-arm64/sbin/nginx

img

编译项目OpenSSL:

# 下载OpenSSL源代码
cd ~/cross-compile
wget https://www.openssl.org/source/openssl-3.1.0.tar.gz
tar -xzf openssl-3.1.0.tar.gz
cd openssl-3.1.0

# 为x86_64编译OpenSSL
echo "=== 编译x86_64版本OpenSSL ==="
./Configure linux-x86_64 --prefix=/usr/local/openssl-x86_64
make -j$(nproc)
make install DESTDIR=../build/x86_64/openssl

# 为ARM64交叉编译OpenSSL
echo "=== 交叉编译ARM64版本OpenSSL ==="
./Configure linux-aarch64 --prefix=/usr/local/openssl-arm64 \
    --cross-compile-prefix=aarch64-linux-gnu-
make -j$(nproc)
make install DESTDIR=../build/arm64/openssl

# 验证编译结果
file ../build/x86_64/openssl/usr/local/openssl-x86_64/bin/openssl
file ../build/arm64/openssl/usr/local/openssl-arm64/bin/openssl

img

性能数据总结

指标x86_64ARM64交叉编译RISC-V交叉编译说明
C编译时间45ms52ms58ms交叉编译略慢
C++编译时间120ms135ms150msC++编译更复杂
Go编译时间200ms210ms220msGo编译最快
hello二进制大小16KB16KB16KB大小相近
nginx编译时间45s52s60s大项目编译
OpenSSL编译时间120s135s150s复杂项目编译

快速入门方法

快速开始流程:

# 1. 安装工具链
sudo dnf install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

# 2. 编译应用
aarch64-linux-gnu-gcc -O2 -o app app.c

# 3. 验证二进制
file app
# 预期:ELF 64-bit LSB executable, ARM aarch64

# 4. 使用QEMU测试
qemu-aarch64-static app

常见问题解决:

# 问题1:找不到头文件
# 解决:指定include路径
aarch64-linux-gnu-gcc -I/usr/aarch64-linux-gnu/include -o app app.c

# 问题2:找不到库文件
# 解决:指定lib路径
aarch64-linux-gnu-gcc -L/usr/aarch64-linux-gnu/lib -o app app.c -lm

# 问题3:QEMU未安装
# 解决:安装QEMU
sudo dnf install -y qemu-user-static

# 问题4:权限不足
# 解决:使用sudo或配置权限
sudo aarch64-linux-gnu-gcc -o app app.c

结语

在 openEuler 上,我们不仅实现了快速安装多语言工具链(C/C++/Go/Python),还支持 x86_64 本地编译、ARM64 和 RISC-V 交叉编译,并能对一些项目如 nginx、OpenSSL 完整编译、测试和性能验证,提供了一个高效、可复用的多架构开发与交付全流程解决方案。

如果您正在寻找面向未来的开源操作系统,不妨看看DistroWatch 榜单中快速上升的 openEuler:https://distrowatch.com/table-mobile.php?distribution=openeuler,一个由开放原子开源基金会孵化、支持“超节点”场景的Linux 发行版。
openEuler官网:https://www.openeuler.openatom.cn/zh/

openEuler x86 中使用qemu搭建ARM64虚拟机运行环境 前提概要 我们日常一般都是相同架构的host上构建相同架构的虚拟机,例如在x86架构的服务器上搭建x86架构的虚拟机,在arm架构的服务器上也一样搭建aarch64架构的虚拟机;但是,如果你手上只有x86服务器,而你又想在使用arm环境来做开发/编译等,那就需要一种工具来支持跨架构翻译不通架构的质量了,把arm指令翻译成x86指令,把x86指令翻译成aarch64指令;具体是那种工具可以搞呢?来... 阅读详情

相关推荐

豆包 ARM64 RPM 包完全指南

是针对AArch64(ARM64)架构编译、打包的RPM软件包,适用于ARM64架构的RPM系Linux系统,是ARM服务器/嵌入式设备标准化分发软件的核心方式。若无ARM64原生环境,可在x86_64的RPM系系统(如CentOS 9 x86_64)交叉构建ARM64 RPM包,核心是指定交叉编译工具链和架构。如果需要针对特定场景(如ARM64内核模块RPM打包、ARM64容器化RPM构建)的细化配置,可补充说明,我会进一步优化。解决:确保在ARM64系统安装,或交叉构建时指定。

m0_37843156的博客 1515

树莓派交叉编译openEuler内核

编译出来的程序,所要运行的目标环境中,各种资源,都相对有限,所以很难进行直接的本地编译。CentOS 7 下编译Linux内核,这个过程也称为本地编译,即在原有x86架构的内核上进行新内核的编译和安装,替换等一系列操作,而新内核也是x86架构的。那么想要在arm架构下的运行编译好的x86架构怎么办,直接将两种不同架构的内核拿来用肯定是不行的,这时候就有了交叉编译。交叉编译是在一种平台(x86)上编译,编译出来的程序,是放到别的平台(arm)上运行即编译的环境,和运行的环境不一样。

weixin_43996213的博客 1135

跨架构实战:在x86环境高效构建openeuler的ARM64 LiveCD镜像

本文详细介绍了在x86架构计算机上高效构建OpenEuler ARM64 LiveCD镜像的完整实战流程。通过巧妙结合QEMU用户态模拟与chroot环境隔离技术,实现跨架构系统编译与打包,为树莓派等ARM设备制作定制化LiveCD系统盘提供了低成本、高效率的解决方案。

weixin_29309475的博客 61

X86 OpenHarmony5.1.0编译及安装

该项目介绍,如何编译运行标准系统。

hero114的专栏 6479

openEuler ARM64 上部署 Docker 的完整实践指南

Docker 是基于 Linux 内核的容器运行时,其核心依赖包括 cgroup v2、namespace 隔离与兼容的 glibc 运行环境。在国产化替代加速推进的背景下,openEuler 作为主流 ARM64 服务器操作系统,已成为鸿蒙生态中实际承载 Docker 工作负载的关键底座。然而,ARM64 架构下存在 ABI 兼容性断层、cgroup v2 启用机制特殊、overlay2 存储驱动性能劣化等典型问题,导致大量开发者在‘鸿蒙 PC’场景中误判系统能力。本文聚焦 openEuler 22.03

weixin_30516429的博客 276

OpenHarmony-X86-引导程序

用于X86机器引导启动OpenHarmony系统,,结合 https://blog.youkuaiyun.com/u012851408/article/details/148565345 文章使用

华为全联接大会HUAWEI Connect 2024印象(一):OpenEuler

刚开始,在一楼看了鲲鹏事业部的展台,重点看了他们的OpenEuler。这点有点类似阿里云的AliOS,AliOS最初也是个全平台的设想,不过现在手机端和物联网端基本都放弃了,只剩下云端的Alibaba Cloud Linux,它是基于龙蜥社区(OpenAnolis) 龙蜥操作系统(Anolis OS)的阿里云发行版。HUAWEI Connect 2024的规模很大,不过主要面向的应该是企业市场,我比较关注的嵌入式系统的内容很少,无线通信的内容也没啥(本来希望看看有没有5G TSN的内容)。

研究兴趣:智能物联网、嵌入式系统、人工智能 1335

基于opc源码编译的OpenHarmony6.0版本x86-64虚拟机镜像

OpenHarmony6.0作为一款开源操作系统,以其轻量级、模块化、分布式的特点备受业界关注。基于opc源码编译而成的OpenHarmony6.0版本x86-64虚拟机镜像,让用户可以轻松体验到这款先进操作系统带来的新功能和特性。通过这一镜像文件,用户能够在x86架构的64位处理器上运行OpenHarmony系统,实现了跨平台的兼容性和灵活性。借助qemu这一功能强大的虚拟化软件,安装过程变得简单快捷,无需进行复杂的硬件配置或系统安装流程。只需完成qemu虚拟机的安装,用户即可快速启动虚拟机并加载OpenHarmony6.0系统镜像,从而开始使用OpenHarmony系统。这种便捷的体验方式极大降低了用户尝试新操作系统的门槛,使得更多人可以轻松接触并了解OpenHarmony。此外,由于qemu支持多种操作系统平台,OpenHarmony6.0 x86-64虚拟机镜像的发布,也允许开发者在不同的宿主操作系统环境下进行应用开发和调试,进一步促进了社区生态的繁荣发展。在技术细节上,这一镜像的编译和构建流程遵循了开源社区的标准,保证了系统的稳定性和安全性,同时使得系统具有较高的可定制性,满足不同场景下的特定需求。这不仅是对开发者友好,也为用户提供了探索鸿蒙系统底层架构的机会。由于鸿蒙系统在物联网设备上的广泛应用,这一镜像的推出,也标志着开发者可以在个人计算机上进行相关应用的模拟测试,缩短开发周期,提升开发效率。 由于镜像下载链接的提供,用户能够直接从可信的源头获取OpenHarmony6.0的x86-64虚拟机镜像,确保了整个下载过程的安全和可靠性。开发者和用户可以放心地进行下载和使用,无需担心潜在的安全风险。此外,下载链接的提供也体现了开源社区的开放性,便于用户快速获取资源,增强了社区的互动性和参与感。 OpenHarmony6.0版本的发布,标志着操作系统在设计哲学、性

【北京迅为】itop-3568 开发板openharmony鸿蒙烧写及测试-第1章 体验OpenHarmony—烧写镜像

)的压缩包到 windows 的任意路径,然后解压压缩包会得到 TOPEET_OPENHARMONY文件夹,进入此文件夹,如下图所示,images下面放置鸿蒙的镜像文件,burnwrite\windows目录下存放烧写器。iTOP-3568开发板\01_【iTOP-RK3568开发板】基础资料\09_iTOP-RK3568开发板OpenHarmony镜像\01_社区版本_V3.2。如果您的烧写工具没有发现设备,可以关闭烧写工具,再重新打开一遍烧写工具,然后重复上面的上电步骤。

BeiJingXunWei的博客 1860

用Python玩转农业大数据:从Landsat遥感影像到作物产量预测实战教程

本文详细介绍了如何利用Python处理Landsat遥感影像数据,并结合土壤信息构建作物产量预测模型。从环境搭建、数据预处理到模型训练与可视化,提供了一套完整的农业大数据分析实战方案,帮助读者掌握遥感影像处理和机器学习在精准农业中的应用。

weixin_30832143的博客 399

嵌入式硬件实战:RC、LC与RL滤波电路的设计与选型指南

本文深入探讨了嵌入式系统中RC、LC与RL滤波电路的设计与选型策略。通过生活化比喻和实战案例,详细解析了三种滤波电路的工作原理、应用场景及工程注意事项,帮助工程师根据电流大小、频率特征和成本预算选择最优方案,提升嵌入式硬件设计的稳定性和抗干扰能力。

kiwi8的博客 284

Harmony PC 版从安装到首个应用开发全教程(附完整代码)

OpenHarmony PC 版目前仍处于快速发展阶段,生态持续完善,作为国产操作系统的重要组成,其 PC 端开发具备极高的学习和探索价值。跟随 OpenHarmony 社区更新,持续积累 ArkTS 开发经验,即可快速掌握鸿蒙 PC 端开发核心能力,参与国产操作系统生态建设。

m0_59315734的博客 3681

芯片级IO (Pad) Ring &IP Checklist

芯片级IO Ring,PAD Ring 和IP Checklist检查项目

weixin_37584728的博客 3573

openEuler多样性算力支持深度评测:x86与ARM双架构适配及性能验证

全架构适配能力扎实:对x86_64和ARM aarch64主流架构实现“零门槛”部署,硬件识别完整,基础服务运行稳定,无兼容性瓶颈。算力性能释放充分:通过内核级指令集优化,双架构下CPU、内存、IO性能均能逼近硬件理论峰值,SPEC CPU 2017得分表现优异。生态兼容性统一:主流开源应用无需修改代码即可跨架构运行,降低开发者迁移成本,实现“一次开发,多架构部署”。

2301_80350265学无止尽5的博客 2万+

关于使用vcpkg下载osgearth遇到的问题

注意--x-manifest-root=后面跟着的E:\gitproject\osgearth-osgearth-3.5\vcpkg是你下载的源码解压缩后vcpkg.json的文件地址,然后等待编译完成。安装vcpkg后使用vcpkg install osgearth:x64-windows安装好osgearth并且导入项目使用时,发现无法运行官方文档中示例的main.cpp。这里写一种自己用过的使用vcpkg安装osgearth3.5的方法,源码,打开vcpkg所在的命令行,执行。示例main.cpp。

m0_61776040的博客 1526

2023全国职业技能大赛 网络系统管理 服务部署 Linux部分--基础配置

服务器和客户端基本配置如下表,各虚拟机已预装系统。一、关闭防火墙和Selinux。七、需要使用到的命令详解。三、修改root密码。

weixin_62926639的博客 1001

openEuler WSL嵌入式开发环境搭建:ARM交叉编译工具链配置全攻略

首先确保openEulerWSL环境是最新的,并安装必要的开发工具: 在openEuler中,一些包的名称可能与其他Linux发行版不同。当遇到"No match for argument"错误时,我们需要寻找替代方案: 由于openEuler仓库可能没有预编译的ARM工具链,我们直接从ARM官网下载: 2.2 验证工具链安装 根据需要,可以安装其他架构的交叉编译工具链: 3.2 编写示例交叉编译项目 创建一个简单的ARM嵌入式项目来测试工具链: 3.3 编译和测试 4.2 创建完整的系统模拟环境

2301_80350265学无止尽5的博客 2万+

VMware16虚拟机:下载和安装教程

VMware16 虚拟机 下载和安装教程

MQ0522的博客 20万+

如何在x86架构的openEuler上编译openGauss

openGauss当前官方支持在ARM架构下的openEuler安装包,本文档帮助读者快速了解在x86架构的openEuler上如何编译openGauss数据库。当前openGauss官方支持ARM架构的openEuler,这里支持x86架构的openEuler需要修改Makefile文件。并拷贝到/root/openGauss-third_party/buildtools/gcc/目录下。从如上GitHub地址下载gcc重命名为:gcc-8.2.0.tar.gz,准备openGauss代码仓库。

weixin_45521613的博客 953

10、贝叶斯曲线拟合与预测分布详解

本文详细介绍了贝叶斯曲线拟合与预测分布的核心概念与计算方法。从最大似然估计出发,引入参数的先验分布,推导出后验分布与最大后验估计,并进一步展示如何通过积分获得完整的预测分布。文章解析了预测分布中均值与方差的构成,强调贝叶斯方法在量化不确定性方面的优势,涵盖金融、医疗、气象等实际应用场景。最后总结了操作步骤与未来研究方向,帮助读者系统掌握贝叶斯方法在回归问题中的应用。

android的专栏 106

使用Python的OpenCV库进行三维重建点云

通过这些步骤,我们可以使用Python的OpenCV库进行三维重建,并生成对应的点云。当然,这只是一个简单的示例,实际的三维重建可能涉及更多的图像处理和计算步骤。在计算机视觉领域,三维重建是一项重要的任务,它可以将多个二维图像或视频序列转换为三维场景模型。在本文中,我们将介绍如何使用Python的OpenCV库进行三维重建,并生成相应的点云。以上是使用Python的OpenCV库进行三维重建点云的简要介绍和示例代码。最后,我们可以将计算得到的三维点云可视化。安装完成后,我们可以开始编写代码。

AuSwift的博客 1646

华为 DevKit 25.2.rc1 源码迁移分析使用教程(openEuler + ARM64)

华为 DevKit 是一款用于 x86 → 鲲鹏(ARM64)平台代码迁移分析 的工具。从 v25.0 起,DevKit 采用 模块化 RPM 包设计 ,需安装多个组件才能使用源码迁移功能。本次实验我带大家实操一下码迁移分析使用,实验有以下几点需要注意。

等风来 9355

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

openEuler ARM环境日常使用维护指南

基于Linux内核支持多种CPU架构(x86_64、aarch64、riscv64)面向服务器、边缘计算、云等场景高性能、高可靠性、高安全性系统特性:充分利用openEuler对ARM架构的优化特性性能优化:针对ARM服务器进行专门的性能调优监控体系:建立完善的系统监控和告警机制自动化运维:通过脚本和工具提高运维效率安全加固:实施多层次的安全防护措施通过本指南的实施,可以确保openEuler ARM系统稳定、高效、安全地运行。版本信息文档版本:1.0。

喝醉酒的小白 943

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

手把手教你用QEMU在x86环境制作openEuler ARM64 LiveCD(含常见错误解决)

本文详细介绍了如何在x86架构主机上,利用QEMU用户态模拟与chroot环境,为ARM64设备制作openEuler LiveCD。文章深入解析了跨架构构建的核心原理,提供了从环境准备、根文件系统构建到LiveCD生成的完整实战步骤,并重点针对livecd-creator执行失败等常见错误提供了深度排错指南,帮助开发者高效完成异构平台系统镜像定制。

grafana8visual的博客 493

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

x86的openEuler使用qemu搭建ARM64架构问题汇总

前言:夏季学期参与openEuler操作系统内核实验的项目,由于网络上缺乏相关的参考资料,所以走了很多弯路,所以将问题整理后进行分享以供大家避坑。 (成功安装的示例会发布在另一篇文章中,这篇文章的尝试都是直接在windows下使用Virtualbox安装openEuler) 项目环境: 1、VirtualBox-6.1.22(直接在网络上或者软件管家中下载即可) 2、openEuler-20.03-LTS-x86_64-dvd (安装镜像网站:ISRC - 镜像站) 问题一:不可以安装增强工具 (1)无论是

qq_43388666的博客 2343

跨越x86与ARM:openEuler全架构算力实战评测

openEuler操作系统通过统一内核和工具链,实现了对x86_64和ARM64架构的全面支持。本次评测展示了在两种硬件平台上部署AI推理应用的完整流程:从环境配置、跨平台代码编写到多架构编译部署。测试结果表明,开发者只需维护一套代码即可在不同架构设备上运行,显著降低了多平台开发复杂度。openEuler的容器化工具iSulad进一步简化了跨架构部署,为异构计算场景提供了高效解决方案。

颜颜yan_的博客 9586
上一篇: Docker部署多个Python项目如何使用Nginx实现负载均衡的解决方案
下一篇: openEuler软件生态体验——从桌面到服务器的全方位探索
AI云原生
博客等级 码龄3年 1万+粉丝 216原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值