基于Zig语言,opencv相关的c++程序静态交叉编译

一、写在前面

1.什么是zig?

Zig 是一种通用编程语言;

Zig 最初的定位就是代替C语言的系统级语言,它提供了与 C 语言几乎 100% 兼容(可直接调用 C 头文件、链接 C 库),同时不需要任何依赖构建系统。

Zig 同时附带一个极强的交叉编译和链接工具链。我们可以用它写代码,也可以只用它的编译器来构建 C/C++ 项目,尤其擅长静态链接和脱离系统依赖构建可执行文件

所以,本项目中,我们用Zig来静态编译我们的主要程序。

2.本文基础思路

使用 aarch64-linux-gnu 工具链编译 OpenCV 静态库 .a ,并用 Zig 静态交叉编译一个图像裁剪程序。

裁剪程序如下: crop.cpp

#include <opencv2/opencv.hpp>
#include <iostream>int main() {cv::Mat img = cv::imread("image.jpg");if (img.empty()) {std::cerr << "Failed to load image.\n";return 1;}int w = std::min(640, img.cols);int h = std::min(640, img.rows);int x = (img.cols - w) / 2;int y = (img.rows - h) / 2;cv::Mat cropped = img(cv::Rect(x, y, w, h));cv::imwrite("output.jpg", cropped);return 0;
}

二、工作环境与Opencv准备

该部分也可以参考其他推文(交叉编译opencv(Cpp)于arm64架构开发板上-CSDN博客)的下载部分。

1.编译工具

Ubuntu 主机(x86_64)上执行:

sudo apt update
sudo apt install cmake ninja-build \gcc-aarch64-linux-gnu g++-aarch64-linux-gnu \

2.opencv源码下载与编译

下载源码,进入编译文件夹

git clone https://github.com/opencv/opencv.git --depth 1 -b 4.x
cd opencv
mkdir build-aarch64
cd build-aarch64

编写工具链文件:

创建 toolchain-aarch64-linux-gnu.cmake 文件

# toolchain-aarch64-linux-gnu.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

注意!我们这里需要编译opencv的静态库!

build-aarch64 目录下执行:

cmake .. \-DCMAKE_TOOLCHAIN_FILE=./toolchain-aarch64-linux-gnu.cmake \-DBUILD_SHARED_LIBS=OFF \-DCMAKE_INSTALL_PREFIX=../install-aarch64 \-DCMAKE_BUILD_TYPE=Release \-DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF \-DBUILD_EXAMPLES=OFF \-DBUILD_opencv_highgui=OFF \-DBUILD_opencv_videoio=OFF

编译与安装:

make -j$(nproc)
make install

编译成功后,结果出现在opencv>install-aarch64文件夹下

三、依赖库安装

安装opencv的基本静态库后,还需要一些其他相关的依赖库:

(可以根据以下指令下载,需要自行修改编译地址)

所有依赖库文件尽量安装在同一文件夹下。比如笔者就安装在了 /home/why/projects/aarch64-sysroot 这一地址下

libz.a:

wget https://zlib.net/zlib-1.3.1.tar.gz
tar -xvzf zlib-1.3.1.tar.gz
cd zlib-1.3.1CC=aarch64-linux-gnu-gcc ./configure --static --prefix=/home/why/projects/aarch64-sysroot
make
make install

libjpeg.a:

wget http://www.ijg.org/files/jpegsrc.v9e.tar.gz
tar -xvzf jpegsrc.v9e.tar.gz
cd jpeg-9eCC=aarch64-linux-gnu-gcc ./configure --host=aarch64-linux-gnu --prefix=/home/why/projects/aarch64-sysroot --enable-static --disable-shared
make
make install

libpng.a:

wget https://download.sourceforge.net/libpng/libpng-1.6.43.tar.gz
tar -xvzf libpng-1.6.43.tar.gz
cd libpng-1.6.43CPPFLAGS="-I/home/why/projects/aarch64-sysroot/include" \
LDFLAGS="-L/home/why/projects/aarch64-sysroot/lib" \
CC=aarch64-linux-gnu-gcc ./configure --host=aarch64-linux-gnu --prefix=/home/why/projects/aarch64-sysroot --enable-static --disable-shared
make
make install

libtiff.a:

wget https://download.osgeo.org/libtiff/tiff-4.6.0.tar.gz
tar -xvzf tiff-4.6.0.tar.gz
cd tiff-4.6.0CPPFLAGS="-I/home/why/projects/aarch64-sysroot/include" \
LDFLAGS="-L/home/why/projects/aarch64-sysroot/lib" \
CC=aarch64-linux-gnu-gcc ./configure --host=aarch64-linux-gnu --prefix=/home/why/projects/aarch64-sysroot --enable-static --disable-shared
make
make install

验证结果:

ls /home/why/projects/aarch64-sysroot/lib/lib*.a

应有类似输出:

四、静态编译

来到 crop.cpp 程序目录下,终端编译:

zig c++ -target aarch64-linux-gnu \-static \-I/home/why/projects/opencv/opencv/install-aarch64/include/opencv4 \-I/home/why/projects/aarch64-sysroot/include \-L/home/why/projects/opencv/opencv/install-aarch64/lib \-L/home/why/projects/aarch64-sysroot/lib \crop.cpp \-lopencv_core -lopencv_imgproc -lopencv_imgcodecs \-ljpeg -lpng -ltiff -lz \-lstdc++ -lm -ldl -lpthread \-o crop_static

需要根据opencv与其依赖库的位置修改指令。

可以得到静态编译结果: crop_static ;拷贝到开发板上,可以直接无依赖运行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90884.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90884.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 LSTM 与 SVM 融合的时间序列预测模型:理论框架与协同机制—实践算法(1)

目录 1、单一模型的局限性&#xff1a;混合架构的设计动机 2、LSTM 的时序特征提取&#xff1a;从原始序列到高阶表征 2.1、门控机制的时序过滤能力 2.2、隐藏状态的特征压缩作用 2.3、预训练的特征优化逻辑 3、SVM 的非线性映射&#xff1a;从高阶特征到预测输出 3.1、…

如何查看docker实例是否挂载目录,以及挂载了哪些目录

一条命令即可一次性列出当前容器里所有挂载点&#xff1a; docker inspect <容器ID或名称> --format{{range .Mounts}}{{printf "%-8s %-35s -> %s\n" .Type .Source .Destination}}{{end}}示例输出&#xff1a; bind /host/owrt/src …

Opentrons 模块化平台与AI技术助力智能移液创新,赋能AAW™自动化工作站

在生命科学领域加速拥抱自动化的关键节点&#xff0c;全球开源实验室自动化领导者 Opentrons 携手全球领先生命科学公司默克生命科学&#xff0c;重磅推出 AAW™智能自动化液体处理平台。这一战略合作的核心技术引擎 ——Opentrons Flex 第三代全自动移液工作站&#xff0c;正以…

C++学习笔记(八:函数与变量)

往篇内容&#xff1a; C学习笔记&#xff08;一&#xff09; 一、C编译阶段※ 二、入门案例解析 三、命名空间详解 四、C程序结构 C学习笔记&#xff08;二&#xff09; 五、函数基础 六、标识符 七、数据类型 补充&#xff1a;二进制相关的概念 sizeof 运算符简介 补…

智慧施工:施工流程可视化管理系统

图扑智慧施工全流程可视化管理系统&#xff0c;通过可视化界面&#xff0c;可直观掌握各工序衔接进度、资源调配情况&#xff0c;快速识别违规作业、设备故障等风险点 —— 如塔吊运行半径重叠、深基坑支护位移预警等。同时&#xff0c;系统支持施工方案模拟推演&#xff0c;对…

单链表的冒泡排序实现:从原理到代码详解

单链表的冒泡排序实现&#xff1a;从原理到代码详解 引言 单链表作为一种常见的数据结构&#xff0c;其排序操作因节点无法随机访问&#xff08;需通过指针遍历&#xff09;而与数组排序存在差异。冒泡排序因其实现简单、无需额外空间&#xff08;仅需指针操作&#xff09;&…

如何在 Ubuntu 24.04 或 22.04 上安装和使用 GDebi

APT 是 Ubuntu 上安装需要外部依赖项的 Debian 包的一种方式,但还有另一种选择,即 GDebi。本文将介绍如何在 Ubuntu 24.04 上安装 GDebi,以及如何使用它来安装 .deb 包所需的依赖项。 什么是 GDebi? GDebi 是默认的 .deb 包安装器 DPKG 的轻量级替代品。与 DPKG 不同,GD…

俄罗斯方块游戏开发(面向对象编程)

摘要本设计基于MATLAB面向对象编程技术&#xff0c;开发了一款具备完整游戏逻辑的俄罗斯方块游戏。通过类封装实现游戏核心模块&#xff08;方块管理、游戏板状态、碰撞检测等&#xff09;&#xff0c;采用旋转矩阵实现方块变形&#xff0c;结合MATLAB图形用户界面&#xff08;…

背包DP之多重背包

背包DP之多重背包一、多重背包基础认知1.1 问题定义1.2 核心特征二、基础解法&#xff1a;暴力拆分2.1 核心思路2.2 代码实现2.3 局限性分析三、优化解法&#xff1a;二进制拆分3.1 优化原理3.2 拆分步骤3.3 代码实现3.4 复杂度分析四、二进制拆分过程五、多重背包的变种与应用…

Ansible 变量指南:声明、优先级、作用域与最佳实践(一)

Ansible 变量的声明 前言 全面理解 Ansible 变量是编写高效、可维护 Playbook 的关键。由于最近使用 Ansible 比较多&#xff0c;在变量问题上踩了不少坑&#xff0c;也因此对变量的声明&#xff0c;优先级和作用域有了更深的理解。姑且总结一下&#xff0c;分享给大家&#…

[极客大挑战 2019]FinalSQL--布尔盲注

直接看题可以看到题目给了提示盲注&#xff01;那么接下来就是寻找注入点了&#xff01;那么不能发现注入点就是id了&#xff01;注入类型为数值型注入&#xff01;这里直接尝试盲注。但是这里and被过滤了&&也不行。问了几个师傅说用or&#xff0c;但是空格被过滤了&am…

再谈fpga开发(状态机的应用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】前面说过&#xff0c;fpga上面最基础的部分是寄存器&#xff0c;而所有寄存器存在每一个clock下&#xff0c;都有被翻转的可能性。至于这些寄存器是…

TCP如何解决网络切换问题

一、传统TCP的网络切换问题核心问题&#xff1a;TCP 连接基于四元组&#xff08;源IP、源端口、目的IP、目的端口&#xff09;&#xff0c;IP 变化导致连接失效二、改进方案与技术演进1. MPTCP&#xff08;多路径TCP&#xff09; - 主流解决方案核心机制&#xff1a;单连接多路…

【Linux】常用命令(一)

【Linux】常用命令 一1. ls1.1 ls -a 显示所有文件及其目录1.2 ls -A 不显示当前目录和父目录1.3 ls -d 显示目录本身&#xff0c;而不是显示其内部内容1.4 ls -i 显示文件的inode属性信息1.4.1 实际用途场景1.5 ls -l 显示文件的详细属性信息1.6 ls -R 递归显示所有子文件1.7 …

Window 部署 coze-stdio(coze 开发平台)

参考链接 https://github.com/coze-dev/coze-studio/wiki/2.-%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B https://github.com/coze-dev/coze-studio/wiki/3.-%E6%A8%A1%E5%9E%8B%E9%85%8D%E7%BD%AE 环境说明 Docker&#xff1a;28.3.2 系统&#xff1a;Window 11 配置要求 CP…

【Git】Git LFS的使用

一、简介 Git LFS&#xff08;Git Large File Storage&#xff09;是由 GitHub 开发的一款 Git 扩展工具&#xff0c;旨在帮助开发者更高效地管理仓库中的大文件。传统 Git 会将文件的每个版本完整存储在仓库历史中&#xff0c;导致大文件&#xff08;如音频、视频、数据集、二…

不坑盒子:Word里1秒制作“花括号”题目,多音字组词、形近字组词……

1. 30秒看懂它能干啥 用“不坑盒子”插件&#xff0c;在 Word 里输入&#xff1a; 乐,l(快乐),yu(音乐);长,chng(长短),zhǎng(长大)点一下【总分关系】&#xff0c;瞬间出现左边是“乐”右边并列两行拼音括号的花括号结构&#xff1b;再点【并列关系】&#xff0c;又能做出只…

Gateway网关层灰度方案—xx互联网医院系统灰度发布设计与思路详解

通过之前技术的积累&#xff0c;终于开始了本文的编写&#xff0c;如果对灰度、负载均衡、上下文传递、网关不太理解&#xff0c;可以先学习博主的以下博客内容。共勉&#xff1a; 企业级 Java 应用灰度发布设计方案与实践全解析《Spring 中上下文传递的那些事儿》 Part 1&…

学习游戏制作记录(改进投掷剑的行为)7.27

1.实现剑跟随飞行方向旋转修改剑的预制体使剑的朝向对准右x轴Sword_Skill_Contorl脚本&#xff1a;private void Update(){transform.right rb.velocity;//时刻更新位置}2.实现剑插入地面或者敌人修改预制体为触发器Sword_Skill_Contorl脚本&#xff1a;private bool canRotat…

嵌入式软件面试八股文

目录 一、指针函数和函数指针 二、指针的大小 三、sizeof 和 strlen 区别 四、数组指针和指针数组 五、C语言里面内存分配的方式 六、struct结构体和union联合体的区别 八、数组和链表的区别 九、写一个宏这个红返回输入参数比较小的一个 十&#xff0c;使用#include<…