在 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的专栏 6478

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

(92页PPT)某大型集团信息化项目企业数字化转型ERP系统蓝图设计规划方案(附下载方式)

同时,外贸获利空间被严重挤压,必须从价格竞争转向品牌竞争。该方案针对某大型外贸集团在数字化时代的转型需求,提出了一套完整的ERP系统建设框架和实施路径,具有很高的专业参考价值。特别值得关注的是方案提出的"价值为先"指导思想,通过将企业价值图与信息系统建设紧密结合,确保IT投资直接支撑价值创造。同时,方案充分考虑了集团多元化、国际化的发展需求,设计了灵活可扩展的系统架构。总的来说,这份实施方案专业性强、内容全面、措施具体,既立足解决当前问题,又着眼未来发展需求,为大型集团企业的数字化转型提供了优秀范本。

AI_data_cloud的博客 1027

【实战】——零代码玩转Supervisely人像分割:从标注到模型训练的数据流水线搭建

本文详细介绍了如何零代码使用Supervisely平台搭建人像分割数据流水线,从智能标注到数据集格式转换,再到模型训练与优化。Supervisely的智能标注工具和协作功能大幅提升了人像分割项目的效率,特别适合视频会议背景虚化、虚拟试衣等应用场景。

weixin_30694389的博客 416

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

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

m0_59315734的博客 3680

HCLR-Net: 混合对比学习正则化与局部随机扰动用于水下图像增强

独特贡献在于开发了一种处理负样本的新策略,既保留了负样本的统计特性,又防止网络过度剖析这些样本中的特征信息。通过根据每个通道特征的重要性对模型进行加权,我们可以增强富含上下文信息的通道,从而获得更准确、更详细的特征表示。AHA 模块利用垂直方向上的 Avgpool 和水平方向上的 Maxpool 来捕捉远程依赖关系和准确的位置信息,从而有效确定不同方向上的特征退化。对比学习策略通常旨在最小化正样本之间的欧氏距离,使预测图像更接近理想图像,同时最大化负样本与预测图像之间的距离,使它们进一步远离非理想表征。

G-Howe的博客 1459

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

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

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

802.1AS时间同步机制深度解析:从Sync报文到多域冗余设计

本文深度解析了802.1AS时间同步机制,从Sync与Follow_Up报文的核心交互原理入手,详细阐述了其如何通过精确的时钟频率比测量、链路延迟计算和驻留时间补偿来实现微秒乃至纳秒级同步。文章进一步探讨了802.1AS-2020版本引入的多时钟域冗余设计,为构建高可靠的车载TSN网络提供了关键见解和实战配置指南。

pytorch8learner的博客 462

多核异构处理器核间通信:从共享内存到RPMsg协议的实战解析

在多核异构处理器架构中,核间通信是实现高效协同计算的核心技术。其基本原理是通过共享内存作为数据交换的物理媒介,配合硬件信号机制实现同步与通知。从技术价值看,它解决了不同架构核心间的数据共享与指令协同问题,是释放异构计算潜力的关键。在应用场景上,该技术广泛应用于智能物联网设备、汽车电子和工业控制等领域,用于连接高性能应用处理器与实时微控制器。本文以典型的ARM Cortex-A与Cortex-M组合为例,深入剖析了基于共享内存和RPMsg协议的通信机制,涵盖了从硬件基础到软件协议栈的完整实现链路,并提供了针对

weixin_26969269的博客 448

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万+

《Sigrity SystemSI 2023+LPDDR4仿真自学笔记》(一)创建工程(Part1)

为了加强SystemSI 2023软件的熟悉度,咱们完整的走一个仿真全流程。

weixin_45199544的博客 6335

如何在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

【STM32Cube_14】使用硬件I2C读写环境光强度传感器(BH1750)

本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外设读取环境光强度传感器数据(BH1750)

Mculover666的博客(嵌入式) 7242

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

等风来 9355

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

喝醉酒的小白 943

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

grafana8visual的博客 493

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、付费专栏及课程。

余额充值