基于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

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)上执行:

cpp 复制代码
sudo apt update
sudo apt install cmake ninja-build \
    gcc-aarch64-linux-gnu g++-aarch64-linux-gnu \

2.opencv源码下载与编译

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

cpp 复制代码
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文件

cpp 复制代码
# 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 目录下执行:

cpp 复制代码
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

编译与安装:

cpp 复制代码
make -j$(nproc)
make install

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

三、依赖库安装

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

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

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

libz.a:

bash 复制代码
wget https://zlib.net/zlib-1.3.1.tar.gz
tar -xvzf zlib-1.3.1.tar.gz
cd zlib-1.3.1

CC=aarch64-linux-gnu-gcc ./configure --static --prefix=/home/why/projects/aarch64-sysroot
make
make install

libjpeg.a:

bash 复制代码
wget http://www.ijg.org/files/jpegsrc.v9e.tar.gz
tar -xvzf jpegsrc.v9e.tar.gz
cd jpeg-9e

CC=aarch64-linux-gnu-gcc ./configure --host=aarch64-linux-gnu --prefix=/home/why/projects/aarch64-sysroot --enable-static --disable-shared
make
make install

libpng.a:

bash 复制代码
wget https://download.sourceforge.net/libpng/libpng-1.6.43.tar.gz
tar -xvzf libpng-1.6.43.tar.gz
cd libpng-1.6.43

CPPFLAGS="-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:

bash 复制代码
wget https://download.osgeo.org/libtiff/tiff-4.6.0.tar.gz
tar -xvzf tiff-4.6.0.tar.gz
cd tiff-4.6.0

CPPFLAGS="-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

验证结果:

bash 复制代码
ls /home/why/projects/aarch64-sysroot/lib/lib*.a

应有类似输出:

四、静态编译

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

bash 复制代码
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 ;拷贝到开发板上,可以直接无依赖运行

相关推荐
猷咪8 分钟前
C++基础
开发语言·c++
17(无规则自律)9 分钟前
【CSAPP 读书笔记】第二章:信息的表示和处理
linux·嵌入式硬件·考研·高考
!chen9 分钟前
linux服务器静默安装Oracle26ai
linux·运维·服务器
IT·小灰灰9 分钟前
30行PHP,利用硅基流动API,网页客服瞬间上线
开发语言·人工智能·aigc·php
快点好好学习吧11 分钟前
phpize 依赖 php-config 获取 PHP 信息的庖丁解牛
android·开发语言·php
秦老师Q12 分钟前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
烟锁池塘柳012 分钟前
解决Google Scholar “We‘re sorry... but your computer or network may be sending automated queries.”的问题
开发语言
是誰萆微了承諾12 分钟前
php 对接deepseek
android·开发语言·php
CSDN_RTKLIB15 分钟前
WideCharToMultiByte与T2A
c++
2601_9498683616 分钟前
Flutter for OpenHarmony 电子合同签署App实战 - 已签合同实现
java·开发语言·flutter