当前位置: 首页 > news >正文

基于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.xdnf.cn/news/1178155.html

相关文章:

  • 微服务-springcloud-springboot-Skywalking详解(下载安装)
  • 设置后轻松将 iPhone 转移到 iPhone
  • 基于SpringBoot+Uniapp的健身饮食小程序(协同过滤算法、地图组件)
  • Socket编程入门:从IP到端口全解析
  • C语言(长期更新)第5讲:数组练习(三)
  • Apache 消息队列分布式架构与原理
  • 开发避坑短篇(5):vue el-date-picker 设置默认开始结束时间
  • LLM层归一化:γβ与均值方差的协同奥秘
  • 力扣面试150题--在排序数组中查找元素的第一个和最后一个位置
  • 5.7 input子系统
  • 「Linux命令基础」查看用户和用户组状态
  • Silly Tavern 教程②:首次启动与基础设置
  • 文件管理困境如何破?ZFile+cpolar打造随身云盘新体验
  • Apache Flink 实时流处理性能优化实践指南
  • TRUMPF TruConvert DC 1008 – 1010 TruConvert System Control 逆变器
  • 货车手机远程启动的扩展功能有哪些
  • 从零用java实现 小红书 springboot vue uniapp(15) 集成minio存储 支持本地和minio切换
  • 如何在 Ubuntu 24.04 服务器或桌面版上安装和使用 gedit
  • AUTOSAR进阶图解==>AUTOSAR_SWS_BSWModeManager
  • 「iOS」——RunLoop学习
  • JS事件基础
  • 锁定锁存器 | 原理 / 应用 / 时序
  • C++中std::list的使用详解和综合实战代码示例
  • 深入掌握CSS Grid布局:每个属性详解与实战示例
  • MIT线性代数01_方程组的几何解释
  • MIT线性代数02_矩阵消元
  • 挖掘录屏宝藏:Screenity 深度解析与使用指南
  • 【C语言进阶】柔性数组
  • 【自动化测试】JMeter+Jenkins自动化接口与性能测试环境部署指南
  • Jenkins最新版本的安装以及集成Allure生成测试报告