linux用opencv静态库编译,如何使用docker中的静态opencv库编译c应用程序

经过大量的实验,我终于有了一些工作!这个Dockerfile中有一些问题已得到解决.为了重现这一点,请创建一个包含以下内容的Dockerfile,并使用上面问题中的简单代码在同一文件夹中创建另一个名为app.cpp的文件.

我将解释下面的问题:

FROM alpine:3.8 as compiler

RUN echo -e '@edgunity http://nl.alpinelinux.org/alpine/edge/community \

@edge http://nl.alpinelinux.org/alpine/edge/main \

@testing http://nl.alpinelinux.org/alpine/edge/testing \

@community http://dl-cdn.alpinelinux.org/alpine/edge/community' \

>> /etc/apk/repositories

RUN apk add --update --no-cache \

build-base \

openblas-dev \

unzip \

wget \

cmake \

g++ \

libjpeg \

libjpeg-turbo-dev \

libpng-dev \

jasper-dev \

tiff-dev \

libwebp-dev \

clang-dev \

linux-headers

ENV CC /usr/bin/clang

ENV CXX /usr/bin/g++

ENV OPENCV_VERSION='3.4.2' DEBIAN_FRONTEND=noninteractive

RUN mkdir /opt && cd /opt && \

wget https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.zip && \

unzip ${OPENCV_VERSION}.zip && \

rm -rf ${OPENCV_VERSION}.zip

RUN mkdir -p /opt/opencv-${OPENCV_VERSION}/build && \

cd /opt/opencv-${OPENCV_VERSION}/build && \

cmake \

-D BUILD_DOCS=OFF \

-D BUILD_EXAMPLES=OFF \

-D BUILD_opencv_apps=OFF \

-D BUILD_opencv_python2=OFF \

-D BUILD_opencv_python3=OFF \

-D BUILD_PERF_TESTS=OFF \

-D BUILD_SHARED_LIBS=OFF \

-D BUILD_TESTS=OFF \

-D CMAKE_BUILD_TYPE=RELEASE \

-D ENABLE_PRECOMPILED_HEADERS=OFF \

-D FORCE_VTK=OFF \

-D WITH_FFMPEG=OFF \

-D WITH_GDAL=OFF \

-D WITH_IPP=OFF \

-D WITH_OPENEXR=OFF \

-D WITH_OPENGL=OFF \

-D WITH_QT=OFF \

-D WITH_TBB=OFF \

-D WITH_XINE=OFF \

-D BUILD_JPEG=ON \

-D BUILD_TIFF=ON \

-D BUILD_PNG=ON \

.. && \

make -j$(nproc) && \

make install && \

rm -rf /opt/opencv-${OPENCV_VERSION}

RUN wget --progress=dot:giga https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.0.0-linux-x86-64.tar.gz && \

pwd && \

tar -xzf libwebp-1.0.0-linux-x86-64.tar.gz && \

mv /libwebp-1.0.0-linux-x86-64/lib/libwebp.a /usr/lib && \

rm -rf /libwebp*

RUN wget --progress=dot:giga http://www.ece.uvic.ca/~frodo/jasper/software/jasper-2.0.10.tar.gz && \

tar -xzf jasper-2.0.10.tar.gz && \

cd jasper-2.0.10 && \

mkdir BUILD && \

cd BUILD && \

cmake -DCMAKE_INSTALL_PREFIX=/usr \

-DCMAKE_BUILD_TYPE=Release \

-DCMAKE_SKIP_INSTALL_RPATH=YES \

-DCMAKE_INSTALL_DOCDIR=/usr/share/doc/jasper-2.0.10 \

-DJAS_ENABLE_SHARED=FALSE \

.. && \

make install && \

rm -rf /jasper-2.0.10*

ENV PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:/usr/lib/pkgconfig

COPY app.cpp app.cpp

RUN g++ -Wl,-Bstatic -static-libgcc -std=c++11 \

app.cpp \

-o /app \

$(pkg-config --cflags --libs -static opencv) \

-lgfortran -lquadmath

FROM alpine

COPY --from=compiler /app /bin/app

问题

确实存在需要链接但不存在的文件,有两个原因:

> pkg-config命令应该发出所有必要的编译标志,但在我之前的尝试中,我没有将-static标志包含在pkg-config中.添加-static标志时,请确保链接所需的额外包.我看到一些人遇到了这个问题的解决方案,添加了额外的标志,如-pthread,但我发现-static标志为我做了这个,所以更可取.

> ld:找不到-lgcc_s错误.这似乎是通过向g添加-static-libgcc标志来解决的.其中一些对我来说仍然是一个谜.

缺少静态库

我希望将两个库作为静态包含在内,需要从apk以外的其他来源获取.这些是libjasper和libwebp.上面有构建步骤,可以根据需要获取和构建这些步骤,并将资源复制到所需的位置.

更多缺失的链接

由于原因我还不能解释pkg-config没有提供最后两个必要的标志.那些是-lgfortran和-lquadmath.

关于此解决方案的说明

我切换到alpine linux,只是因为我读过有些人用它取得了成功,我确信Ubuntu也可以这样做.它确实产生了一个小得多的图像,所以我喜欢这样.对于中间图像,这大约是900mb,虽然很大,但比1.9GB的Ubuntu图像要小得多.

实际生成的图像大约为44mb,包括所有静态链接的OpenCV库.对于那些需要小型docker镜像来运行单个C bin的人来说,这似乎是一个很好的解决方案.

你可能感兴趣的:(linux用opencv静态库编译,如何使用docker中的静态opencv库编译c应用程序)