利用docker搭建cgo程序的交叉编译环境

上一篇借助qemu虚拟机实现了armhf和arm64架构的原生平台的程序编译。虽然它稳定好用,但有一个致命的缺点,特别慢。

同样的代码编译x86_64平台windows和linux的程序只需不到1分钟,而借助虚拟机编译armhf和arm64平台linux的程序要十多分钟。

于是我花了两天时间摸索交叉编译的方法,最终实现了对armhf和arm64架构的linux程序、amd64架构的windows程序、以及mac amd64和mac arm64架构的程序在amd64架构的linux下的交叉编译,算是实现了当前全部主流平台下调用gocv库的程序的交叉编译。

为了方便使用,我还是通过docker镜像来管理编译环境。

交叉编译最困难的地方在于相关的资料太少了,需要自己一点一点尝试。下面我展示一下这几个环境交叉编译的Dockerfile,大家沿着相应的思路就能实现其他程序的交叉编译了。

mac版的交叉编译借助了fyne的交叉编译镜像,fyne是go的一个跨平台gui库,用起来不是很方便,只能做玩具,想用到实际工作中太困难了,有很多坑。

但是它提供的交叉编译工具fyne-cross特别好用,尤其是它填了linux下针对mac进行交叉编译时的各种坑。不过由于由于苹果的版权限制,所以mac的交叉编译镜像不能公开提供,大家只能自己下载xcode然后从中提取交叉编译需要用到的工具,具体的步骤是:

  1. 去苹果官网下 Command_Line_Tools_for_Xcode_13.4.dmg(只要版本大于12.4就行,我下的是13.4)
  2. 安装fyne-cross
  3. 运行 fyne-cross darwin-image --xcode-path /path/to/Command_Line_Tools_for_Xcode_13.4.dmg
  4. 等一会就会生成fyneio/fyne-cross:1.3-darwin的mac交叉编译镜像。Enjoy!

大家感兴趣的话可以去fyne的网站瞧一瞧:
https://github.com/fyne-io/fyne-cross

交叉编译最关键的地方就是配置编译器和编译器标志了,对于opencv来说在配置cmake的时候指定CMAKE_TOOLCHAIN_FILE可以很轻松地实现对armhf和arm64的交叉编译,如果是要编译windows的话需要手动设置CMAKE_C_COMPILERCMAKE_CXX_COMPILERCMAKE_SYSTEM_NAMECMAKE_SYSTEM_PROCESSOR 这几个cmake变量,具体细节可以看下面的dockerfile.

windows amd64:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
FROM ubuntu

LABEL maintainer="Jiangda He. mail: hejiangda@gmail.com"

ENV OPENCV_VERSION=4.5.5

ENV BUILD="unzip \
wget \
build-essential \
cmake \
curl \
git \
mingw-w64 \
mingw-w64-common \
mingw-w64-i686-dev \
mingw-w64-tools \
mingw-w64-x86-64-dev \
ca-certificates \
pkg-config"

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt-get update && apt-get install -y --no-install-recommends ${BUILD}

RUN mkdir /tmp/opencv && \
cd /tmp/opencv && \
wget -O opencv.zip https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.zip && \
unzip opencv.zip && \
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/${OPENCV_VERSION}.zip && \
unzip opencv_contrib.zip && \
mkdir /tmp/opencv/opencv-${OPENCV_VERSION}/build && \
rm opencv.zip opencv_contrib.zip && \
cd /tmp/opencv/opencv-${OPENCV_VERSION}/build && \
cmake \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=/tmp/opencv/opencv_contrib-${OPENCV_VERSION}/modules \
-D WITH_FFMPEG=OFF \
-D WITH_GTK=OFF \
-D WITH_1394=OFF \
-D WITH_TIFF=OFF \
-D BUILD_opencv_world=ON \
-D INSTALL_C_EXAMPLES=NO \
-D INSTALL_PYTHON_EXAMPLES=NO \
-D BUILD_ANDROID_EXAMPLES=NO \
-D BUILD_DOCS=NO \
-D BUILD_TESTS=NO \
-D BUILD_PERF_TESTS=NO \
-D BUILD_EXAMPLES=NO \
-D BUILD_opencv_java=NO \
-D BUILD_opencv_python=NO \
-D BUILD_opencv_python2=NO \
-D BUILD_opencv_python3=NO \
-D WITH_TBB=OFF \
-D WITH_IPP=OFF \
-D BUILD_SHARED_LIBS=NO \
-D OPENCV_GENERATE_PKGCONFIG=YES \
-D CMAKE_C_COMPILER=x86_64-w64-mingw32-gcc-posix \
-D CMAKE_CXX_COMPILER=x86_64-w64-mingw32-g++-posix \
-D CMAKE_SYSTEM_NAME=Windows \
-D CMAKE_SYSTEM_PROCESSOR=AMD64 \
-D CMAKE_CXX_STANDARD=11 \
.. && \
cd /tmp/opencv/opencv-${OPENCV_VERSION}/build && make -j12 && \
make install -j12 && \
rm -rf /tmp/opencv/

RUN wget https://go.dev/dl/go1.18.linux-amd64.tar.gz && rm -rf /usr/local/go && tar -C /usr/local -xzf go1.18.linux-amd64.tar.gz && rm -rf go1.18.linux-amd64.tar.gz
ENV PATH=$PATH:/usr/local/go/bin
ENV CGO_CPPFLAGS="-I/usr/local/include/opencv4"
ENV CGO_LDFLAGS="--static -L/usr/local/lib -L/usr/local/lib/opencv4/3rdparty -lopencv_img_hash455 -lopencv_world455 -lIlmImf -llibjpeg-turbo -llibpng -llibwebp -lzlib -lade -llibopenjp2 -llibprotobuf -lquirc -lpthread -lm -lkernel32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 -luser32"
ENV CGO_ENABLED=1
ENV GOOS=windows
ENV GOARCH=amd64
ENV CC=x86_64-w64-mingw32-gcc-posix
ENV CXX=x86_64-w64-mingw32-g++-posix

WORKDIR /root/

armhf:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
FROM ubuntu
# aarch64
LABEL maintainer="Jiangda He. mail: hejiangda@gmail.com"

ENV OPENCV_VERSION=4.5.5

ENV BUILD="unzip \
wget \
crossbuild-essential-armhf \
cmake \
curl \
git \
ca-certificates \
pkg-config"

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt-get update && apt-get install -y --no-install-recommends ${BUILD}

RUN mkdir /tmp/opencv && \
cd /tmp/opencv && \
wget -O opencv.zip https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.zip && \
unzip opencv.zip && \
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/${OPENCV_VERSION}.zip && \
unzip opencv_contrib.zip && \
mkdir /tmp/opencv/opencv-${OPENCV_VERSION}/build && \
rm opencv.zip opencv_contrib.zip && \
cd /tmp/opencv/opencv-${OPENCV_VERSION}/build && \
cmake \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=/tmp/opencv/opencv_contrib-${OPENCV_VERSION}/modules \
-D WITH_FFMPEG=OFF \
-D WITH_GTK=OFF \
-D WITH_1394=OFF \
-D WITH_TIFF=OFF \
-D BUILD_opencv_world=ON \
-D INSTALL_C_EXAMPLES=NO \
-D INSTALL_PYTHON_EXAMPLES=NO \
-D BUILD_ANDROID_EXAMPLES=NO \
-D BUILD_DOCS=NO \
-D BUILD_TESTS=NO \
-D BUILD_PERF_TESTS=NO \
-D BUILD_EXAMPLES=NO \
-D BUILD_opencv_java=NO \
-D BUILD_opencv_python=NO \
-D BUILD_opencv_python2=NO \
-D BUILD_opencv_python3=NO \
-D WITH_TBB=ON \
-D BUILD_TBB=ON \
-D BUILD_SHARED_LIBS=NO \
-D OPENCV_GENERATE_PKGCONFIG=YES \
-D CMAKE_TOOLCHAIN_FILE=/tmp/opencv/opencv-${OPENCV_VERSION}/platforms/linux/arm-gnueabi.toolchain.cmake .. && \
cd /tmp/opencv/opencv-${OPENCV_VERSION}/build && make -j12 && \
make install -j12 && \
rm -rf /tmp/opencv/

RUN wget https://go.dev/dl/go1.18.linux-amd64.tar.gz && rm -rf /usr/local/go && tar -C /usr/local -xzf go1.18.linux-amd64.tar.gz && rm -rf go1.18.linux-amd64.tar.gz
ENV PATH=$PATH:/usr/local/go/bin
ENV CGO_CPPFLAGS="-I/usr/local/include/opencv4"
ENV CGO_LDFLAGS="--static -L/usr/local/lib -L/usr/local/lib/opencv4/3rdparty -lopencv_world -lopencv_img_hash -lade -llibopenjp2 -llibwebp -littnotify -llibpng -lquirc -lzlib -llibjpeg-turbo -llibprotobuf -ltbb -ldl -lpthread -lm"
ENV CGO_ENABLED=1
ENV GOOS=linux
ENV GOARCH=arm
ENV CC=arm-linux-gnueabihf-gcc
ENV CXX=arm-linux-gnueabihf-g++
WORKDIR /root/

arm64:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
FROM ubuntu
# aarch64
LABEL maintainer="Jiangda He. mail: hejiangda@gmail.com"

ENV OPENCV_VERSION=4.5.5

ENV BUILD="unzip \
wget \
crossbuild-essential-arm64 \
cmake \
curl \
git \
ca-certificates \
pkg-config"

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt-get update && apt-get install -y --no-install-recommends ${BUILD}

RUN mkdir /tmp/opencv && \
cd /tmp/opencv && \
wget -O opencv.zip https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.zip && \
unzip opencv.zip && \
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/${OPENCV_VERSION}.zip && \
unzip opencv_contrib.zip && \
mkdir /tmp/opencv/opencv-${OPENCV_VERSION}/build && \
rm opencv.zip opencv_contrib.zip && \
cd /tmp/opencv/opencv-${OPENCV_VERSION}/build && \
cmake \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=/tmp/opencv/opencv_contrib-${OPENCV_VERSION}/modules \
-D WITH_FFMPEG=OFF \
-D WITH_GTK=OFF \
-D WITH_1394=OFF \
-D WITH_TIFF=OFF \
-D BUILD_opencv_world=ON \
-D INSTALL_C_EXAMPLES=NO \
-D INSTALL_PYTHON_EXAMPLES=NO \
-D BUILD_ANDROID_EXAMPLES=NO \
-D BUILD_DOCS=NO \
-D BUILD_TESTS=NO \
-D BUILD_PERF_TESTS=NO \
-D BUILD_EXAMPLES=NO \
-D BUILD_opencv_java=NO \
-D BUILD_opencv_python=NO \
-D BUILD_opencv_python2=NO \
-D BUILD_opencv_python3=NO \
-D WITH_TBB=ON \
-D BUILD_TBB=ON \
-D BUILD_SHARED_LIBS=NO \
-D OPENCV_GENERATE_PKGCONFIG=YES \
-D CMAKE_TOOLCHAIN_FILE=/tmp/opencv/opencv-${OPENCV_VERSION}/platforms/linux/aarch64-gnu.toolchain.cmake .. && \
cd /tmp/opencv/opencv-${OPENCV_VERSION}/build && make -j12 && \
make install -j12 && \
rm -rf /tmp/opencv/

RUN wget https://go.dev/dl/go1.18.linux-amd64.tar.gz && rm -rf /usr/local/go && tar -C /usr/local -xzf go1.18.linux-amd64.tar.gz && rm -rf go1.18.linux-amd64.tar.gz
ENV PATH=$PATH:/usr/local/go/bin
ENV CGO_CPPFLAGS="-I/usr/local/include/opencv4"
ENV CGO_LDFLAGS="--static -L/usr/local/lib -L/usr/local/lib/opencv4/3rdparty -lopencv_world -lopencv_img_hash -lade -llibopenjp2 -llibwebp -ltegra_hal -littnotify -llibpng -lquirc -lzlib -llibjpeg-turbo -llibprotobuf -ltbb -ldl -lpthread -lm"
ENV CGO_ENABLED=1
ENV GOOS=linux
ENV GOARCH=arm64
ENV CC=aarch64-linux-gnu-gcc
ENV CXX=aarch64-linux-gnu-g++
WORKDIR /root/

amd64:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
FROM ubuntu

LABEL maintainer="Jiangda He. mail: hejiangda@gmail.com"

ENV OPENCV_VERSION=4.5.5

ENV BUILD="unzip \
wget \
build-essential \
cmake \
curl \
git \
libz-dev\
ca-certificates \
pkg-config"

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt-get update && apt-get install -y --no-install-recommends ${BUILD}

RUN mkdir /tmp/opencv && \
cd /tmp/opencv && \
wget -O opencv.zip https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.zip && \
unzip opencv.zip && \
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/${OPENCV_VERSION}.zip && \
unzip opencv_contrib.zip && \
mkdir /tmp/opencv/opencv-${OPENCV_VERSION}/build && \
rm opencv.zip opencv_contrib.zip && \
cd /tmp/opencv/opencv-${OPENCV_VERSION}/build && \
cmake \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=/tmp/opencv/opencv_contrib-${OPENCV_VERSION}/modules \
-D WITH_FFMPEG=OFF \
-D WITH_GTK=OFF \
-D WITH_1394=OFF \
-D WITH_TIFF=OFF \
-D BUILD_opencv_world=ON \
-D INSTALL_C_EXAMPLES=NO \
-D INSTALL_PYTHON_EXAMPLES=NO \
-D BUILD_ANDROID_EXAMPLES=NO \
-D BUILD_DOCS=NO \
-D BUILD_TESTS=NO \
-D BUILD_PERF_TESTS=NO \
-D BUILD_EXAMPLES=NO \
-D BUILD_opencv_java=NO \
-D BUILD_opencv_python=NO \
-D BUILD_opencv_python2=NO \
-D BUILD_opencv_python3=NO \
-D WITH_TBB=ON \
-D BUILD_TBB=ON \
-D WITH_IPP=OFF \
-D BUILD_SHARED_LIBS=NO \
-D OPENCV_GENERATE_PKGCONFIG=YES \
.. && \
cd /tmp/opencv/opencv-${OPENCV_VERSION}/build && make -j12 && \
make install -j12 && \
rm -rf /tmp/opencv/

RUN wget https://go.dev/dl/go1.18.linux-amd64.tar.gz && rm -rf /usr/local/go && tar -C /usr/local -xzf go1.18.linux-amd64.tar.gz && rm -rf go1.18.linux-amd64.tar.gz
ENV PATH=$PATH:/usr/local/go/bin
ENV CGO_CPPFLAGS="-I/usr/local/include/opencv4"
ENV CGO_LDFLAGS="--static -L/usr/local/lib -L/usr/local/lib/opencv4/3rdparty -lopencv_world -lopencv_img_hash -lade -llibopenjp2 -llibwebp -littnotify -llibpng -lquirc -llibjpeg-turbo -llibprotobuf -ltbb -lIlmImf -ldl -lpthread -lm -lz"
WORKDIR /root/

mac版的交叉编译需要在之前用fyne-cross生成的镜像的基础上进行处理,这里我的镜像是fyne-cross:1.3-darwin

mac amd64:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
FROM fyne-cross:1.3-darwin
# mac amd64
LABEL maintainer="Jiangda He. mail: hejiangda@gmail.com"

ENV OPENCV_VERSION=4.5.5

ENV BUILD="unzip \
wget \
build-essential \
cmake \
curl \
git \
libz-dev\
ca-certificates \
pkg-config"

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt-get update && apt-get install -y --no-install-recommends ${BUILD}

RUN mkdir /tmp/opencv && \
cd /tmp/opencv && \
wget -O opencv.zip https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.zip && \
unzip opencv.zip && \
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/${OPENCV_VERSION}.zip && \
unzip opencv_contrib.zip && \
mkdir /tmp/opencv/opencv-${OPENCV_VERSION}/build && \
rm opencv.zip opencv_contrib.zip && \
cd /tmp/opencv/opencv-${OPENCV_VERSION}/build && \
cmake \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=/tmp/opencv/opencv_contrib-${OPENCV_VERSION}/modules \
-D WITH_FFMPEG=OFF \
-D WITH_GTK=OFF \
-D WITH_1394=OFF \
-D WITH_TIFF=OFF \
-D BUILD_opencv_world=ON \
-D INSTALL_C_EXAMPLES=NO \
-D INSTALL_PYTHON_EXAMPLES=NO \
-D BUILD_ANDROID_EXAMPLES=NO \
-D BUILD_DOCS=NO \
-D BUILD_TESTS=NO \
-D BUILD_PERF_TESTS=NO \
-D BUILD_EXAMPLES=NO \
-D BUILD_opencv_java=NO \
-D BUILD_opencv_python=NO \
-D BUILD_opencv_python2=NO \
-D BUILD_opencv_python3=NO \
-D WITH_AVFOUNDATION=OFF \
-D WITH_TBB=OFF \
-D WITH_IPP=OFF \
-D BUILD_SHARED_LIBS=NO \
-D OPENCV_GENERATE_PKGCONFIG=YES \
-D CMAKE_C_COMPILER=o64-clang \
-D CMAKE_CXX_COMPILER=o64-clang++ \
-D CMAKE_SYSTEM_NAME=Darwin \
-D CMAKE_INSTALL_NAME_TOOL=x86_64-apple-darwin20.4-install_name_tool \
-D CMAKE_LINKER=x86_64-apple-darwin20.4-ld \
-D CMAKE_SYSTEM_PROCESSOR=AMD64 \
-D CMAKE_AR=/osxcross/target/bin/x86_64-apple-darwin20.4-ar \
-D CMAKE_OSX_SYSROOT=/osxcross/target/SDK/MacOSX11.3.sdk/ \
-D CMAKE_CXX_STANDARD=11 \
-D CMAKE_OSX_ARCHITECTURES="x86_64" \
.. && \
cd /tmp/opencv/opencv-${OPENCV_VERSION}/build && make -j12 && \
make install -j12 && \
rm -rf /tmp/opencv/

WORKDIR /root

ENV CGO_ENABLED=1
ENV GOOS=darwin
ENV GOARCH=amd64
ENV CC=o64-clang
ENV CXX=o64-clang++
ENV OSXCROSS_NO_INCLUDE_PATH_WARNINGS=1
ENV CGO_CPPFLAGS="-I/usr/local/include/opencv4"
ENV CGO_LDFLAGS="-L/usr/local/lib -L/usr/local/lib/opencv4/3rdparty -L/osxcross/target/SDK/MacOSX11.3.sdk/System/Library/Frameworks -lopencv_world -llibprotobuf -llibjpeg-turbo -llibwebp -llibpng -llibopenjp2 -lIlmImf -lzlib -lquirc -lade -littnotify -ldl -framework Accelerate -framework AppKit -framework Cocoa -framework OpenCL -framework Accelerate -framework AppKit -framework Cocoa -framework OpenCL"

mac版的交叉编译需要在之前用fyne-cross生成的镜像的基础上进行处理,这里我的镜像是fyne-cross:1.3-darwin

mac arm64:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
FROM fyne-cross:1.3-darwin
# mac arm64
LABEL maintainer="Jiangda He. mail: hejiangda@gmail.com"

ENV OPENCV_VERSION=4.5.5

ENV BUILD="unzip \
wget \
build-essential \
cmake \
curl \
git \
libz-dev\
ca-certificates \
pkg-config"

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt-get update && apt-get install -y --no-install-recommends ${BUILD}

RUN mkdir /tmp/opencv && \
cd /tmp/opencv && \
wget -O opencv.zip https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.zip && \
unzip opencv.zip && \
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/${OPENCV_VERSION}.zip && \
unzip opencv_contrib.zip && \
mkdir /tmp/opencv/opencv-${OPENCV_VERSION}/build && \
rm opencv.zip opencv_contrib.zip && \
cd /tmp/opencv/opencv-${OPENCV_VERSION}/build && \
cmake \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=/tmp/opencv/opencv_contrib-${OPENCV_VERSION}/modules \
-D WITH_FFMPEG=OFF \
-D WITH_GTK=OFF \
-D WITH_1394=OFF \
-D WITH_TIFF=OFF \
-D BUILD_opencv_world=ON \
-D INSTALL_C_EXAMPLES=NO \
-D INSTALL_PYTHON_EXAMPLES=NO \
-D BUILD_ANDROID_EXAMPLES=NO \
-D BUILD_DOCS=NO \
-D BUILD_TESTS=NO \
-D BUILD_PERF_TESTS=NO \
-D BUILD_EXAMPLES=NO \
-D BUILD_opencv_java=NO \
-D BUILD_opencv_python=NO \
-D BUILD_opencv_python2=NO \
-D BUILD_opencv_python3=NO \
-D WITH_TBB=OFF \
-D WITH_IPP=OFF \
-D BUILD_SHARED_LIBS=NO \
-D OPENCV_GENERATE_PKGCONFIG=YES \
-D CMAKE_C_COMPILER=oa64-clang \
-D CMAKE_CXX_COMPILER=oa64-clang++ \
-D CMAKE_SYSTEM_NAME=Darwin \
-D CMAKE_INSTALL_NAME_TOOL=arm64-apple-darwin20.4-install_name_tool \
-D CMAKE_LINKER=arm64-apple-darwin20.4-ld \
-D CMAKE_SYSTEM_PROCESSOR=ARM64 \
-D CMAKE_AR=/osxcross/target/bin/arm64-apple-darwin20.4-ar \
-D CMAKE_CXX_STANDARD=11 \
.. && \
cd /tmp/opencv/opencv-${OPENCV_VERSION}/build && make -j12 && \
make install -j12 && \
rm -rf /tmp/opencv/

ENV CGO_CPPFLAGS="-I/usr/local/include/opencv4"
ENV CGO_LDFLAGS="-L/usr/local/lib -L/usr/local/lib/opencv4/3rdparty -lopencv_world -llibprotobuf -llibjpeg-turbo -llibwebp -llibpng -llibopenjp2 -lIlmImf -lzlib -lquirc -lade -littnotify -ltegra_hal -ldl -framework AVFoundation -framework CoreGraphics -framework CoreMedia -framework CoreVideo -framework QuartzCore -framework AppKit -framework Cocoa -framework OpenCL -framework Accelerate"
ENV CGO_ENABLED=1
ENV GOOS=darwin
ENV GOARCH=arm64
ENV CC=oa64-clang
ENV CXX=oa64-clang++
ENV OSXCROSS_NO_INCLUDE_PATH_WARNINGS=1

WORKDIR /root

江达小记