一、寫在前面
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 ;拷貝到開發板上,可以直接無依賴運行